题目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是共享同一段内存就是了