指针与数组有着本质的区别,分别举例来说明他们的工作过程。
char szC[5] = "abcd";
char c = szC[3];
上面这条语句的工作过程如下:
1.编译器符号表中有个szC,对应地址1234;
2.将地址1234加上偏移3,得1237;
3.取地址1237的内容。
char * p = "abcd";
char c = p[3];
上面这条语句的工作过程如下:
1.编译器符号表中有个p,对应地址5678;
2.取地址5678的内容,9876;
3.将地址9876加上偏移3,得9879;
4.取地址9879中的内容;
Then,如果定义一个数组char p[5] = "abcd";而在另一个文件中这样声明:extern char * p;编译器的原则是,既然p声明为指针,那么不管它原来定义是指针还是数组,都按指针来处理。那么char c = p[3];的工作过程将按照上面的第二种情况来进行,如下:
1.编译器符号表中有个p,对应地址1234;
2.取地址1234的内容,'a',即97;
3.将地址97加上偏移3,得100;
4.取地址100中的内容。
可见,上面的过程将会引发不可预知的后果。