今天又翻阅了一下西邮Linux小组的邮件列表,发现这个问题应该还有很多同学不知道吧,贴出来共同学习一下。。。。。。
********************************************问题提出****************************************
有一个C语言的程序,可以运行成功,但是我没有理解透彻,请高手指点下,程序如下:
1 #include
2 int main()
3 {
4 int a=3, b = 5;
5 printf(&a["H!Hello! what are you doing? %s\n"], &b["good!linux"]);
6 printf(&a["WHAT%c%c%c %c%c %c !\n"], 1["this"],
7 2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
8 return 0;
9 }
***********************************************回复一*************************************
看看下面代码你就知道了
[root@dhcp-66-70-48 ~]# cat a.c
#include
int main(void)
{
int a[2]={1,2};
printf("%d %d\n",a[0],a[1]);
printf("%d %d\n",0[a],1[a]);
return 0;
}
[root@dhcp-66-70-48 ~]# ./a.out
1 2
1 2
***********************************************回复二*************************************
实际上我们用到的数组取下标有如下的2种形式:
int a[x];
a[x];
x[a];//x is a number!
这2种是等价的,都是取从a开始加上偏移量x的地址所存放的内容,剩下的你自己再
想想就明白了,无非是取[]里从x开始的字符,组合起来就OK了。
***********************************************回复三*************************************
4 int a=3, b = 5;
5 printf(&a["H!Hello! what are you doing? %s\n"], &b["good!linux"]);
根据执行结果,你原程序H!之间漏了个字符,姑且认为是'i'。
&b["good!linux"]
等于 &5["good!linux"]
等于 &("good!linux"[5])
等于 &(*(此字面量首地址 + 5))
等于 (此字面量首地址 + 5)
就是个字符指针了,printf于是输出"linux"