c语言指针注意事项

 这几天对C语言的指针温习了下,感觉理解又更深入了一步

C语言的精髓是指针我想确实一点都不错,但是在使用的时候有很多要注意的地方,大概总结一下:

1.指针指向常量区,是不能修改其值的

比如:

char *p ="abcfd";

char *ptr ="abcfd";

*(p+1) ='C';  //此时会报错,因为"abcfd"为常量区,其值是无法修改的

 

解决方法用字符数组来解决

char p[100]="abcfd";

*(p+1) ='C';

 

char p[100]="abcfd"和char *p ="abcfd"在于前者为变量空间,可以简单的理解为将"abcfd"这个常量在变量区做了一份拷贝赋给数组p[100]

后者则是直接将指针指向存储于常量去的字符串.

p和ptr则指向相同的内存地址

 

2.数组名所代表的指针是无法修改的,因为其本身是一个常量

比如:

char p[100]="abcfd";

*(p++) ='C';//此时会报错,因为p为常量,不能进行自加动作

 

3.指针数组其保存的值是同维度数组的地址,而不是值

比如:

int a[2][2]={{1,2},{3,4}};

int (*p)[2]=a;

 

*(*p+1)  表示的a[0][1]

*(p+1)  表示的是a[1][0]的地址

*(p+1)[1] 表示的a[1][1]的地址

*p  表示存储的a[0][0]

 

4.p 和 *p的区别

比如:

int a=2;

int b=5;

int *p  =&a;

*p =5;

*p = b;

p的值为保存a的地址 *p表示以p里存储的地址所指向的内存的值 *p =5和*p = b则表示将p所指向的内存地址的值修改为5 或b

 

5.指针之间的算术运算是基于指针类型所定

比如:

int a[5]={0,1,2,3,4};

int *p,*q;

p=q =a;

p++;

 

p-q ==1//此时则为1

(char *)p -(char *)q ==4 //此时则为4

 

6.&array和array的区别

&array其所赋的指针为数组指针 arra则表示的是指针

int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1)); //输出为2,5

///

int a[2][2]={1,2,3,4};
int *ptr=(int *)(&a+1); //可以理解为将a的值加上一个sizeof(int a[][])

printf("%d"*(ptr-1)); //输出为4

 

&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
&a是数组指针,其类型为 int (*)[5];
 

7.多级指针和多级数组的概念相同

比如:

int a[2][2]={1,2,3,4};

*a表示的是一维数组0所在的地址

*(a+1)表示的一维数组1所在的地址

**a表示的是a[0][0]的值

*(a+1)[1]表示的是a[1][1]的值 

 

8.指针类型和指针所指向的类型

  指针的类型


  你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。  

        (1)int*ptr;//指针的类型是int*  
  (2)char*ptr;//指针的类型是char*  
  (3)int**ptr;//指针的类型是int**  
  (4)int(*ptr)[3];//指针的类型是int(*)[3]  
  (5)int*(*ptr)[4];//指针的类型是int*(*)[4]  


  指针所指向的类型


  当你通过指针来访问指针所指向的内存区域数据 你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。  

        (1)int*ptr;//指针所指向的类型是int  
  (2)char*ptr;//指针所指向的的类型是char  
  (3)int**ptr;//指针所指向的的类型是int*  
  (4)int(*ptr)[3];//指针所指向的的类型是int()[3]  
  (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]

 

9.指针和数组的初始化

     指针可以在申明后,进行初始化

     数组必须在申明的时候进行初始化

比如:

    char *p="fds";     <--------> char *p;  p ="fds";

 

    char p[12];p=”Visual C++”;  这样赋值就是错误的,原因是P此时为常量的数组名,为只读

 

10.数组的&和不用&的区别

  对数组进行&运算表示的是取以数组类型的指针,对其进行进一步运算的基础以数组类型为单位

  而不用&直接操作数组名,只是取数组成员

比如:

  char p[]="fdsf";

 

  *(p+1) 则表示取'd‘

 

11.指向数组的指针,可以理解为二级指针,

比如:

 int a[4][2] ={1,2,3,4,5,6,7,8};
 int (*p)[4];

 p =a;

 printf("%d",p[1][2]);  //为7

 printf("%d  %d",p[1],*p[1]); //分别为5的地址和5

 

12.多维数组的表示方式,可以理解为同等维度的指针

比如:

static  int  b[3][2]={1,3,5,7,9,11}; //可以将b理解为int (*b)[2]

访问具体元素的方式为 b[m][n],同样可以为*(*(b+m)+n)

 

 13.sizeof的区别

   sizeof来测量指针,始终为4(根据具体字长) <当指针作为形参传入函数内部,其sizeof的值也固定为4,而不论指针类型>

  

 

 

还有很多要注意的地方,暂时先记在这,楼下的朋友可以进一步补充.

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyhorse2010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值