这里首先说明一点:char *p和a[] 不是一回事,详情将后续更新。
那么两者最大的区别是什么呢?答:一个存了,一个没存!
为啥?先说第一个,第一个其实就是一个字符数组的定义连同初始化的过程,只不过长度缺省,这种情况编译器是允许的,其长度为后面初始化字符串的长度+1(因为‘\0’)。这个相信大家学过C语言看过教材的都应该知道。我们可以试图打印数组a处的地址,并注意和第二种写法的地址做比较!
重点是第二种写法 ,这种写法其实是定义了一个字符指针,指向这个字符串,也就是保存了www.dotcpp.com这个字符串的首地址,而本质上并未存储字符串本身,仅仅是”指向”。
这里的字符串其实就是一个没有名字的静态字符数组,会被编译器存储在只读内存中,导致它无法被修改,这里它做右值,会被转化为一个地址,也就是这个字符串在只读内存中存储的位置,大家可以打印出来观察:
当我们试图修改这个字符串,比如试图给p[i]赋值的时,程序编译没有错,但运行就会崩溃。大家可自行上机实验!
还有问题,请大家随时留言与我们沟通!
C语言研究中心(www.dotcpp.com)