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

本文详细解析了多重指针、不同类型指针、指针与数组、const指针间的使用规则及限制,帮助读者深入理解指针的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 *schar 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]+1a[1]的地址,而a[0][0]+1却是a[0][1]的地址。
 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值