深入讨论指针的兼容性问题

1.1 多重指针﹑一重指针和普通变量之间的兼容
例子如下: char a=’w’; char *p; char **q; char ***m; 这些变量的正确赋值可以如下: p=&a; q=&p; m=&q, 但是想越级赋值(即变量赋值给二重指针或更多重指针)实现的可能性就不大,虽然 *q=&a 在编译阶段不会出现任何错误,但是在运行阶段却会出错。总结可以看出,要使这些指针变量不出现错误就得让他们最基本的那个变量得到值,如: p,q,m 等,而不能是 *p,*q,**m 等。原因是真正的变量是 p,q,m 等,而 &,* 只是个操作符号,不能在加上操作符号之后再赋值。
1.2 不同类型之间的指针
在不同的类型之间的指针不能赋值,它不象普通变量之间可以赋值一样,他们的赋值会出现编译错误。例如: char m=’w’; int p=&m;
1.3 指针与数组
例如: int *pt; int (*pa)[3]; int ar1[2][3]; int ar2[3][2]; int **p2;
Pt=&ar1[0][0];
Pt=ar1[0]
这两个是正确的赋值,对于数组来说, ar1,ar1[0] &ar1[0][0] 的地址是一样的,但是 pt 不能被 ar1 赋值,因为即使是赋值了,但是 pt++ 就不知道要指向哪个地方了,所以不能赋值。
Pa=ar1, 由此可以看出指针数组的个数要和数组中的列数一样。当 pa 指向了 ar1 之后它自加一就变成了下一行的地址,所以要得到它里面的值需要如下: *(*(pa+0)+2)
pa=ar2 时就会出现编译错误。
1.4 const 与一般指针
Int *p1;
Const int *p2;
Const int **pp2;
P1=p2;
这个是非法的,因为 const 变量是不允许改变的,但是把它赋值给普通指针之后很有可能会被改变,所以不能这样赋值。
P2=p1;
这个是正确的,普通变量赋值给别的变量不在乎是否会被改变,况且赋值给 const 是不可能会被改变值的。(这是理论上的说法,要看不同的系统中,在检查严格的系统中将不会允许这种情况的出现。
1.5 最后讲的一个问题是地址问题 。如: char *s char m=’w’; s=&m; 但是通过计算机检查可以发现 s &s 的值是不一样的,但是在数组中却是一样的,如: a,a[0], &a,&a[0],&a[0][0] 的地址是一样的,但是 a,a[0], &a[0][0] 却是有差异的, a+1 的地址为一堆乱码, a[0]+1 a[1] 的地址,而 a[0][0]+1 却是 a[0][1] 的地址。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值