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]
的地址。