1

谁能帮我理解以下代码:

int d = 4;
printf(&d["Hay!Hello %c\n"], &4["BuddyWorld"]);           // Hello (some address in char)
printf(&d["Hay!Hello %c\n"], 4["BuddyWorld"]);            // Hello y
printf(&d["Hay!Hello %s\n"], 4["BuddyWorld"]);            // Segmentation fault
printf(&d["Hay!Hello %s\n"], &4["BuddyWorld"]);           // Hello yWorld

printf("d[Hay!Hello %s\n"], &4["BuddyWorld"]);      
/* warning: passing argument 1 of 'printf' makes pointer 
   from integer without a cast                           */

d[] 或 &d[] 运算符到底是什么?(d 是一个整数)为什么会&4["BuddyWorld"]产生4[BuddyWorld]不同的值?(分别为“W”和“y”)

4

3 回答 3

3

When you write something like a[i], it gets expanded into *(a + i). (We say a[i] is syntactic sugar for *(a + i)).

Addition is commutative, so "BuddyWorld"[4] = *("BuddyWorld" + 4) = *(4 + "BuddyWorld") = 4["BuddyWorld"], where "BuddyWorld" implicitly stands for its address in memory.

于 2012-10-22T15:05:36.450 回答
2

C中的下标很奇怪。a[b]变成(加上指针*(a + b)得到的地址处的东西)。但是,因为,它也可以反过来()。这就是正在发生的一切。特别是,“HelloWorld”实际上是一个指向存储字符串字符的字符数组的指针。baa + b == b + aa[b] == b[a]

于 2012-10-22T15:04:33.383 回答
1

d["Hay!Hello %c\n"]是一样的"Hay!Hello %c\n"[d]

并且&运营商给出了指向内容的地址

于 2012-10-22T15:05:05.230 回答