程序博客网 > 大学生笔记本必备软件
来源:互联网 发布:大学生笔记本必备软件 编辑:程序博客网 时间:2024/06/05 16:39
题目1
int arr[]={6,7,8,9,10};int *ptr=arr;*(ptr++)+=123;printf("%d,%d",*ptr,*(++ptr));
为什么答案是8,8
正确的解答:
int arr[]={6,7,8,9,10}; int *ptr=arr; //ptr指向了arr*(ptr++)+=123; //这个语句这样写不太好,容易让人困惑,其实是首先做了+=操作,然后指针才//进行自加操作的printf("%d,%d",*ptr,*(++ptr));//printf操作是从右到左边的的,是首先进行了++ptr操作的
题目2
union U{ struct { unsigned int a:1; unsigned int b:2; unsigned int c:3; } I; char chr;};void main(){ U u; u.chr = 100; printf("%d,%d,%d,",u.I.a,u.I.b,u.I.c);}
union U{ struct { unsigned int a:1; unsigned int b:2; unsigned int c:3; } I; char chr;};void main(){ U u; u.chr = 100;//100对应的2进制是1100100 printf("%d,%d,%d,",u.I.a,u.I.b,u.I.c);//按字节对齐 从低位到高位 往下排列}
所以 a对应0 b对应2 c对应4
union U{ struct { unsigned int a:1;//位域 也就是说用1 bit来表示a unsigned int b:2; unsigned int c:3; } I; char chr;};sizeof(u)=max(sizeof(I),sizeof(chr))=1; 并且联合的内存是可以复用的,你给chr赋值100,他的二进制是0110 0100那么a占第1位也就是最右边低位0,所以他的值为0 b占2位也就是从右边第2位到第3位 10所以他的值为2,c从第4位起到第6为占3个位置也 就是100 所以他的值是4. 记住 结构I和chr是共享同一段内存就是了