一个C语言的疑惑

来源:百度知道 编辑:UC知道 时间:2024/06/05 20:14:54
#include<stdio.h>
void main(){
int i=0;
char stuffing[44];

for (i=0;i<=40;i+=4)
*(long *) &stuffing[i] = 0x80484bb;
puts(stuffing);
}
这个程序中*(long *) &stuffing[i] = 0x80484bb;怎么解释???

什么是什么?

简单讲这是使用长整数(long,四字节)对字符型(单字节)数组赋值。这样做一般是出于效率考虑的(一次可以同时给四个单元赋值)

其机制为:
&stuffing[i]首先是取出stuffing中的第i个元素的地址,这时可理解成一个char*(字符型指针);
在前面加了个(long*)是强制转换成长整型指针(long *);
最后是赋值操作。

下面这两个语句
for (i=0;i<=40;i+=4)
*(long *) &stuffing[i] = 0x80484bb;
可以分解成以下几步:
char *pChar;
long *pLong;
for(i=0;i<40;i++)//注意i不能为40,否则会越界
{
pChar = &stuffing[i];
pLong = (long*)pChar;
*pLong = 0x80484bb;/*这个0x80484bb包含了不可显示字符,所以puts显示会出现奇怪的符号*/
//这样赋值后:stuffing[i]=0xbb,stuffing[i+1]=0x84,stuffing[i+2]=0x04,stuffing[i+3]=0x08
//之所以这样是因为对long的存储是:低位在前,高后在后。
}

*(long *) &stuffing[i] = 0x80484bb; 写成这样是检查你指针方面的学习.

首先stuffing[i]是一个元素,然后用了取地址&符号,然后强制类型转换为long指针类型,最后取他的内容.

OX表示十六进制数,
顶楼上的,蛮好的

*(long *) &stuffing[i] = 0x80484bb;
&stuffing[i] = 0x80484bb; 意思是对一个地址名赋值.
(long *) &stuffing[i] = 0x80484bb; 把地址名转换成指针类型.因为stuffing[i]只是一个数组.

*(long *) &s