C语言----指针

来源:互联网 发布:尚观linux 百度网盘 编辑:程序博客网 时间:2024/05/29 19:33

一、声明

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;}
  • 本文参考自百度百科
1 0
原创粉丝点击