const
char
str1[]=”abc”;
const
char
str2[]=”abc”;
const
char
*p1 = “abc”;
const
char
*p2 = “abc”;
|
判断下列说法哪个是正确的(注意是地址):__E____。
A . str1和str2地址不同,P1和P2地址相同。
B. str1和str2地址相同,P1和P2地址相同。</pre>
c. str1和str2地址不同,P1和P2地址不同。
D. str1和str2地址相同,P1和P2地址不同。
E.4个地址都不相同
str1, str2,p1,p2都是四个普通变量,存在栈区,分别,分别,分别开辟4个地方(对于32位机,每个地方4个字节,对于64位机,每个地方8字节)来存这四个变量的值。注:::变量存放在哪里,与const声名无关,const声名限制的是变量值能不能改变的问题,而不是决定变量存在哪个地方。 const char str1[]=“abc”,首先“abc”是字符串常量,存在数据区。然后给数组赋值,怎么赋值,先在内存中开辟一段空间,然后逐个字符复制过去。然后这段内存有个起始地址,那起始地址的值存在哪里?存在str1里面也就是最开始说的4字节。 const char str2[]=“abc”,系统又开辟了一段新的空间,去复制abc到那段空间去,并把那段空间的首地址值存在str2里面。 const char* p1 =“abc”,这句话,系统并没有去开辟一段新空间来复制“abc”,而是将其首字母的地址赋给了前面开辟的p1的4字节空间,所以p1的值是“abc”的首地址。 同样,把“abc”的首地址赋给p2的四字节空间。 注意“abc”存在常量区,位置和内容都不会改变。 综上,str1,str2,p1,p2是在栈区不同位置开辟的变量,所以他们的地址当然不同。 但是他们的值呢?str1的值是新开辟的一段用来复制“abc”的空间的首地址,str2的值是另一个新开辟用来复制“abc”的空间的首地址 的值,所以str1的值与str2的值不等,而p1,p2的值都是“abc”的首地址,所以p1与p2是相等的