日志档案

发表于 2007-8-22 10:08:51

8

标签: C语言  指针  数组名  

C语言中指针和数组名小趣

在C语言中,指针和数组名通常都可以混用。
例如
char *p;
访问时,*p跟p[0]是一样的,*(p+1)跟p[1]是一样的。
对于数组
char b[5];
访问时,b[0]跟*b是一样的,b[2]跟*(b+2)是一样的。

在一般的通信中(例如串口),通常都使用字节传输。而像float,long int之类的,
有4字节。我的方法就是取它的地址,强制转换为char型指针,然后当作数组来用。
float x;
SBUF=((char*)&x)[0];
SBUF=((char*)&x)[1];
SBUF=((char*)&x)[2];
SBUF=((char*)&x)[3];
接收时,刚好倒过来。

更有趣的是,对于数组形式,数组名和后面的偏移量可以随便换。
char buff[10];
//或者用 char *buff=&buffer;

buff[3]=0xaa;
3[buff]=0xaa;  //居然是一样的,倒塌...

因此,我认为编译器是这么干的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy),
因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了...非典用法,请勿乱用,出了事偶不负责...

 

(By  computer00 @ http://www.ednchina.com/Blog/computer00/ @2007-08-22)

系统分类: 软件开发   |   用户分类: 编程田地   |   来源: 原创   |   【推荐给朋友】

    阅读(1362)    回复(3)  

投一票您将和博主都有获奖机会!

  • yifenqian

    2007-9-8 10:29:28

    假如谁这样用了估计别人也是没有办法看的明白的

  • ochapman

    2008-7-2 20:20:15

    因此,我认为编译器是这么干的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy), **************************************** 在编译时,对数组元素a[i]就是按照*(a+i)处理来的,即按数组首元素的地址加上相对位移量得到要找的元素的地址,然后找到该单元的内容。[]实际上是变址运算符,即将a[i]按a+i计算地址,然后找出此地址的值。 这是书上的讲的内容 ======================================= 因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了 *************************************** 对于char型是可以的(因为一个字节!),但是对例如float型的数组就出问题了。 float xxx[yyy];//假设float为4字节 xxx=1000,yyy=3 那么xxx[yyy]的地址:1000+3*4=1012; 如果yyy[xxx]的地址:3+1000*4=4003; 个人想法

  • computer00

    2008-7-2 21:35:58

    哈哈~~~那样也是不会错的~~~ 因为yyy[xxx]相当于(yyy+xxx),而加法运算对指针来说,本来就是要按照数据类型来操作的。 就像你所说的float类型指针,如果float型指针yyy的值为1000,yyy+3的结果实际上是1000+3*sizeof(float)。如果float是四字节的话,那么就是1012。也就是说,不管你写成3+yyy或者yyy+3,结果都是1012。同理,写成yyy[3]或者3[yyy]也都是1012。不信你可以自己去验证。