【发布时间】:2012-10-12 10:13:12
【问题描述】:
谁能帮我理解下面的代码:
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”)
【问题讨论】:
-
a[i]和i[a]都是一样的,*(a + i)。这有帮助吗? -
但我仍然不明白为什么
&4[BuddyWorld]和4[BuddyWorld]会产生不同的值? (分别为“W”和“y”) -
@zeroone 4["BuddyWorld"] 是
'y',第五个字符。&4["BuddyWorld"]是它的地址,即"BuddyWorld"的地址加上一个偏移量。 -
@isbadawi 你的意思是
("BuddyWorld" + 4)等于&4["BuddyWorld"]。"%c"转换说明符不需要 char 类型的参数(不是 char * 类型)吗? -
@isbadawi 所说的内容,以及当地址(部分)被解释为
int并打印为char时,您得到的取决于字符串文字的存储位置,并且当您尝试将字符“y”解释为地址时,它通常不指向您被允许访问的内存,因此是段错误。 -"BuddyWorld" + 4确实变成了&"BuddyWorld"[4]。%c格式需要int(这应该是提升char的结果)。传递char*类型的参数是未定义的行为,但它可以编译,因为通常无法对printf参数进行类型检查。