Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682852
  • 博文数量: 183
  • 博客积分: 9166
  • 博客等级: 中将
  • 技术积分: 1920
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-31 16:17
文章分类

全部博文(183)

文章存档

2010年(159)

2009年(24)

分类:

2009-11-14 07:15:32



今天又翻阅了一下西邮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"
阅读(778) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~