首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的C语法1["ABCDE"]?

奇怪的C语法1["ABCDE"]?
EN

Stack Overflow用户
提问于 2012-10-22 23:02:37
回答 3查看 339关注 0票数 1

有没有人能帮我理解一下以下代码:

代码语言:javascript
复制
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”)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-22 23:04:33

C语言中的下标很奇怪。将a[b]转换为*(a + b) (通过将b添加到指针a而获得的地址处的内容)。然而,自a + b == b + a以来,它也以另一种方式工作(a[b] == b[a])。这就是正在发生的一切。特别是,"HelloWorld“实际上是一个指向存储字符串字符的字符数组的指针。

票数 2
EN

Stack Overflow用户

发布于 2012-10-22 23:05:36

当您编写像a[i]这样的代码时,它会扩展为*(a + i)。(我们说a[i]*(a + i)的语法糖)。

加法是可交换的,所以"BuddyWorld"[4] = *("BuddyWorld" + 4) = *(4 + "BuddyWorld") = 4["BuddyWorld"],其中"BuddyWorld"隐式地表示它在内存中的地址。

票数 3
EN

Stack Overflow用户

发布于 2012-10-22 23:05:05

d["Hay!Hello %c\n"]"Hay!Hello %c\n"[d]相同。

&运算符给出所指向内容的地址

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13014193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档