理解C语言的精典小题目

参考:https://blog.csdn.net/qq_41035588/article/details/79673674
理解指针

#include int main() { char a[20] = "You_are_a_girl"; char *p = a; char **ptr = &p; printf("p= %d\n", p); printf("ptr= %d\n", ptr); printf("*ptr= %d\n", *ptr); printf("**ptr = %c\n", **ptr); ptr++; printf("ptr= %d\n", ptr); printf("*ptr= %d\n", *ptr); printf("**ptr = %c\n", **ptr); }

执行结果
【理解C语言的精典小题目】理解C语言的精典小题目
文章图片

第四,第七行打印结果
误区一、输出答案为Y 和o
误解:ptr 是一个char 的二级指针,当执行ptr++; 时,会使指针加一个sizeof(char),所以输出如上结果,这个可能只是少部分人的结果.
误区二、输出答案为Y 和a误解:ptr 指向的是一个char *类型,当执行ptr++; 时,会使指针加一个sizeof(char *)(有可能会有人认为这个值为1,那就会得到误区一的答案,这个值应该是4,参考前面内容), 即&p+4; 那进行一次取值运算不就指向数组中的第五个元素了吗?那输出的结果不就是数组中第五个元素了吗?答案是否定的.
正解: ptr 的类型是char **,指向的类型是一个char *类型,该指向的地址就是p的地址(&p),当执行ptr++; 时,会使指针加一个sizeof(char*),即&p+4; 那*(&p+4)指向哪呢,这个你去问上帝吧,或者他会告诉你在哪?所以最后的输出会是一个随机的值,或许是一个非法操作.
总结一下:
一个指针ptrold 加(减)一个整数n 后,结果是一个新的指针ptrnew,ptrnew 的类型和ptrold 的类型相同,ptrnew 所指向的类型和ptrold所指向的类型也相同。ptrnew 的值将比ptrold 的值增加(减少)了n 乘sizeof(ptrold 所指向的类型)个字节。就是说,ptrnew 所指向的内存区将比ptrold 所指向的内存区向高(低)地址方向移动了n 乘sizeof(ptrold 所指向的类型)个字节。指针和指针进行加减:两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。两个指针可以进行减法操作,但必须类型相同,一般用在数组方面,不多说了。

    推荐阅读