一 .大端与小端:
在每个字节中,大端的高位放在地字节,地位放到高字节,
在小端中,高位放到高字节,地位放到地字节。
例如char a[5] = {0, 1, 2, 3, 4}
short *p = (short *)(a + 2);
short i = *p;
printf("%x/n", i);
return 0;
输出结果:0X302;
因为在小端模式下,short *p = (short *)(a + 2);将&a[2]的地址转化为short型,
在小端下,从高地址向低地址转化一次存储0302;打印结果为0x0302;但是由于打印模式将0302的
第一位不是0的开始打印;所一最终结果为0X302;
考虑一下将short改为int;打印结果0x5040302
二 关于printf函数:
这是最基本的函数,可是我对他很陌生,因为有时候你会发现这样的问题;
int ar[]= {6, 7, 8, 9, 10};
int *ptr = ar;
*(ptr++) += 123;
printf("%d %d /n", *ptr, *(++ptr));
结果: 7, 8。基本上很多人都会是这种结果,但是自己运行一下结果震惊:8 8;
为什么,可能你会说是编译器的问题,但是实际上是printf函数的问题,在汇编中,printf函数
会先将第二个参数计算并压栈,然后第一个,所以结果是8 8; 可能我的解释有不太清楚,但是运行结果
肯定是正确的。
三 一个有意思的地址操作的问题
struct A{
short i;
short j;
char ch;
int m;
};
#define PRINT (char *) &(((struct A *)0) -> m)
int main(void)
{
printf("%d/n", PRINT);
}
打印结果:8。
首先这个结构体在内存中占12个字节,((struct A *)0)的意思是将0地址转化为struct A型,结果
0~12的地址空间为struct A型, ((struct A *)0) -> m 的意思是取结构体元素m的地址,
&(((struct A *)0) -> m)意思是取m的地址的地址,
所以printf("%d/n", PRINT);的意思是打印m的地址的地址所存储的值。前面的(char *),shi 没有什么用 的。
不要被它晕住。
c几个题
最新推荐文章于 2022-11-20 15:45:08 发布