sizeof(a)=8、sizeof(p)=4、sizeof(*p)=1、strlen(a)=7、strlen(p)=7。
先说sizeof(a)=8:
sizeof(a)是计算数组a所占用的字节数。你定义的a是字符型数组,其中每个元素是一个字符,并初始化为(string!)(不含括号)。当你用char a[]=“string!”这种方式初始化字符数组时,系统要自动计算a所占用的字节数(这里string!长度为7)并在最后增加一个字节存放字符串结束符NULL,所以a一共要8个字节,即sizeof(a)=8;如果用a[]={'s','t','r','i','n','g','!'}的方式初始化,那就是7了。
再说sizeof(p)=4:
sizeof(p)是计算存放指针变量p所需要的字节数。无论指针变量是指向什么类型的数据的,存放它都需要4个字节。
第三个sizeof(*p)=1:
sizeof(*p)是计算存放*p需要多少字节。p=a使p指向了a,那么*p就是a[0]的值s,s只需要一个字节。
第四个strlen(a)=7:
sizeof是运算符,而strlen是函数,这里它用来计算调用它的实参字符串a的长度。C/C++规定用strlen()计算字符串长度时,不计最后的那一位结束符NULL,所以是7。
最后strlen(p)=7:
strlen(p)是计算字符串p的长度。p已初始化为a了,那么strlen(p)就等价于strlen(a),所以也是7。其实数组名a也是指针,只不过它是常指针,不能进行a--、a++的操作,也不能赋新值;而p是字符型指针变量,不仅可以p--、p++,还可以让它指向任何字符型变量。
这里的主要困惑可能在于sizeof(p)和strlen(p),前者是4,后者是7。看一下运算符sizeof()和函数strlen()对参数的要求就明白了:sizeof()的参数是变量名或类型名,即可以写成这样sizeof(char)或sizeof(int),所以sizeof(p)就是计算指针变量p需要几个字节存放。而函数strlen()要求的参数一定是字符串名或字符串指针,它计算的是特定的字符串需要多少字节存放;当然实际上还得在计算出来的数值上加1,因为还有个NULL,这是规定。
APAAP
sizeof(a) =8
sizeof(p)=4
sizeof(*p)=1
strlen(a) =7
strlen(p)=7
sadfsadf