码迷,mamicode.com
首页 > 编程语言 > 详细

C语言----指针

时间:2015-06-17 16:41:09      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:c语言   指针   

一、声明

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语言----指针

标签:c语言   指针   

原文地址:http://blog.csdn.net/zhengang007/article/details/46535001

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!