当我搞乱C阵列时,我偶然发现了这个奇怪的结果:
char s[100] = "hello";
if(s == &s[0]) printf("true. ");
if(s == &s) printf("true.");
// output: true. true.
我知道s
保存第一个元素的内存位置,但有没有办法找到s
的地址(指向第一个元素的指针的地址)?为什么&s
等于s
?并不是说这很有用,但我想知道幕后发生了什么。
我不确定不同的编译器是否以不同的方式实现它,但我使用的是gcc。
答案 0 :(得分:10)
如果我告诉你把手指放在内存中字符数组所在的位置,然后是数组中第一个字符所在的位置,它们不一样吗?
答案 1 :(得分:9)
那是因为s不是指针,而是数组。必要时(如strcpy等),数组会自动转换为指针,但不存在“指向第一个元素的指针的地址”。 s只是堆栈上的100个字节;只要需要指针,编译器就会将这100个字节的地址传递给函数调用。
答案 2 :(得分:4)
数组s
不包含内存地址(即指针),它实际上包含所有字符。
C会自由地将数组转换为指向数组的指针。
指向数组的指针与指向其第一个元素的指针相同。
答案 3 :(得分:3)
& s [0]表示数组s的第一个元素的地址。 & s [0]的类型是char *。
& s表示数组的地址。 & s的类型是char(*)[100]。
& s [0] + 1是下一个1字节的地址。 但是& s + 1是下一个1 * 100 = 100字节的地址。
答案 4 :(得分:1)
另一方面,您也可以这样做:
char (*t)[100] = s;
if(t == &t[0]) printf("true 3. ");
if(t == &t) printf("true 4.");
在这种情况下,t
确实是指向具有自己的存储和地址的字符数组的指针。案例3为真,案例4为 false 。
答案 5 :(得分:0)
Value of &s, s and &s[0] are same, but their types are not same.
type of &s is char (*)[100], but type of s and &s[0] is char*.
&s is a pointer to the entire array but s and &s[0] points to
the first element of the array.
sizeof(&s) and sizeof(s) is 100, but sizeof(&s[0]) is 4.
Similarly if s = 1000, then &s+1 returns 1100 but s+1 and &s[0]+1 returns 1001.