C char数组中的奇数

时间:2009-05-22 04:42:47

标签: c arrays pointers

当我搞乱C阵列时,我偶然发现了这个奇怪的结果:

char s[100] = "hello";
if(s == &s[0]) printf("true. ");
if(s == &s) printf("true.");
// output: true. true.

我知道s保存第一个元素的内存位置,但有没有办法找到s的地址(指向第一个元素的指针的地址)?为什么&s等于s?并不是说这很有用,但我想知道幕后发生了什么。

我不确定不同的编译器是否以不同的方式实现它,但我使用的是gcc。

6 个答案:

答案 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.