编辑:感谢前一个StackExchange问题的链接,答案是a [b]被定义为 *(a + b),这样" a" [0] = 0 [" a"] = *(" a" +0)。我想这是有效的,因为" a"指针?所以我不能说:
int i;
i[0];
但我可以说:
int i;
i["a"];
我试图了解这段代码是如何编译的,以及发生了什么。任何提示将不胜感激。另外,如果你知道一个很好的参考资料来理解C语言中真正发生的事情,请随意将它放在我身上。
代码在这里:
int i;
main()
{
int j;
int k;
j=i["a"]; //printf says j is 97!
k=i["b"]; //printf says k is 98!
}
那么......到底是怎么回事?!我宣布"我"作为一个整数,然后我将它视为一个没有编译错误/警告的数组,我输入一个字符串作为数组的参数,仍然没有问题?有人有主意吗?提前谢谢。
答案 0 :(得分:3)
字符可以隐式转换为整数。
您看到的数字对应于字符编码中使用的位数。在这种情况下,看起来字符是以ascii编码的,它给出了这些特定的小数。 http://en.wikipedia.org/wiki/ASCII如果您在其中查找a
和b
的代码,您会看到相应的十进制代表:a=97
b=98
。
当您在main之外写int i
时,它会被初始化为0(我不完全确定C标准是否要求,我现在只是查看它,但无论如何,许多编译器都会这样做)。然后,当您撰写i["a"]
时,这相当于0["a"]
,而*(0 + "a")
依次为"a"[0]
。"a"
。当您在代码中定义类似"a"[0]
的内容时,您将获得string literal,这意味着它是指向char的指针。因此char
只是"a"
数组a
的第一个字符,它只是字符'a'
。如果字符97
由97表示,那么当您获取整数表示时,将获得{{1}}作为结果。
答案 1 :(得分:3)
是的,这实际上是有效的C,正如迈克尔在评论中提到的那样。 array[1]
相当于*(array + 1)
,相当于1[array]
。
在您的情况下,i["a"]
相当于0["a"]
,相当于"a"[0]
"a"
。当然,97是'小写a'的ASCII。
更多关于C的索引运算符:http://boredzo.org/pointers/#indexing
顺便说一下,如果你正在使用gcc或clang,你可以使用-Wall -Wextra -pedantic
编译你的代码来查看所有编译器警告(而不是你讨价还价,我认为)。