C语言----指针
2015-06-17 16:16
253 查看
一、声明
int *p ; // ( int * )( p )
二、野指针—-避免方法
1)指针变量一定要初始化为NULL,因为任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。2)当指针p指向的内存空间释放时,没有设置指针p的值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。例如:
int*p=newint(6); delete p; if(p!=NULL) { *p=7; cout<<p<<endl; }
正确的写法应该是下面的代码:
int*p=newint(6); delete p; p=NULL; if(p!=NULL) { *p=7; cout<<p<<endl; }
所以动态分配内存后,如果使用完这个动态分配的内存空间后,必须习惯性地使用delete操作符取释放它。
三、结构体指针访问成员变量:
(*p).sex = ‘m’ p->sex = ‘m'
( *p )对指针取值后是结构体变量, .sex是访问成员变量使用指针可以直接访问结构体
成员变量 p -> sex 。
四、结构体数组与指针
结构体数组的 数组名 是 结构体 指针 常量。数组的特点为:数组名是第一个数组元素的首地址;
结构体数组的数组名是第一个结构体类型的元素的首地址;
通过结构体指针来操作结构体数组。
五、
指向有N个元素的数组指针。int array[2][3] = { 1, 2, 3, 4, 5, 6 }; int (*p)[3] = array ; printf ( “ %d”, * ( * ( p + 1 ) + 1 ) ) ; 结果 : 5
int p[3] p是一个数组,此数组有3个元素,每个元素都是int类型,也就是指向整型数据的指针类型。
int a=10,b=20,c=30; int*p[3]={&a,&b,&c};
而int(*p)[3]中的p是一个指向数组的指针,此数组有3个int类型的元素。例如:
int a[3]={1,2,3}; 那么p就是指向这个数组a的指针。 int(*p)[3]=&a; // 这里赋值一定要用取地址符号。也就是取数组a的地址。
不可以这样赋值: int(p)[3]=a; // error :类型不兼容。a本来是数组类型,是不可以赋值给int()[3]这个类型的。
但是这样是可以的int p1=a; // ok 因为a可以隐式转换为int类型,其值实际上就是数组第一个元素的地址,也就是&a[0]
*p[3] 这个是一个指针数组 它所代表的意思是每一个元素都相当于一个指针变量
而(*p)[3] p是一个指针变量,表示指向含有3个整型元素的一维数组
前者可以类似于二维数组 把它看成是由3个一维数组组成的 经常与字符串搭配使用 比较方便操作 把多个字符串放在一个指针数组中
后者是用来引用二维数组的 像a[2][3]这个二维数组 我们既可用指针来引用 又可用(*p)[3]来引用 一般使用(*p)[3]
例:
int main() { int i,j; int a[2][3]={3,4,5,6,7,8}; int *p[3] ;//表示存贮是3个整型变量地址; int (*q)[3]; //表示指向3个整型数组元素的一维数组指针 //把第一行三个元素地址存放在p指针数组中 for( i=0;i<3;++i) p[i]=&a[0][i]; //输出指针数组中地址所对应值 for( j=0;j<3;++j) cout<< *p[j]<<" "; cout<<endl; q=a;//把数组a开始地址赋给指向一维数组q; for(i=0;i<2;i++) for(j=0;j<3;j++) cout<< *(*(q+i)+j)<<" "; //输出数组中元素 return 0; }
本文参考自百度百科
相关文章推荐
- 谈 C++ 中的 new/delete 和 new[]/delete[]
- C语言----宏
- C++ find 函数用法
- C++命名空间 namespace的作用和使用解析
- POJ 1581 A Contesting Decision
- 对比文件MD5差异并保存
- 条款05:了解C++默默编写并调用哪些函数
- C++11 标准新特性: 右值引用与转移语义(点评)
- How to Properly Write Received UDP Audio Data to ALSA with C++
- C++ 12.1 类的定义、声明、成员函数、数据成员
- 《The Design and evolution of C++》读书笔记1
- 收藏:c语言的多线程同步
- C语言sscanf的用法总汇
- LeetCode 200. Number of Islands
- C++11 标准新特性: 右值引用与转移语义
- C/C++ char和int的区别
- C++函数模板使用中的注意事项
- 学长们的求职血泪史(C/C++/JAVA)
- VC++在一个类中调用另一个类中的函数
- 精确度问题