这是一个完全有效的代码,该代码中只有一行使我感到困惑,我不明白。
如何以及为什么
cp[1] = 0
,据我了解应该是01
还是?
#include <stdio.h>
int main(void){
char *cp;
short *sp;
int *ip;
short x[6];
int i, y;
y = 0x0102;
printf("y = %x\n" , y);
for(i = 0; i < 6; i++){
x[i] = y; y = y +0x1010;
}
printf("y = %x\n" , y);
printf("x[0] = %x\n" , x[0]);
printf("x[1] = %x\n" , x[1]);
printf("x[2] = %x\n" , x[2]);
printf("x[3] = %x\n" , x[3]);
printf("x[4] = %x\n" , x[4]);
printf("x[5] = %x\n" , x[5]);
cp = (char*) x;
printf("1)*cp = %x\n" , *cp);
sp = x;
printf("2)*sp = %x\n" , *sp);
printf("3)*cp[3] = %x\n" , cp[3]);
printf("3)*cp[6] = %x\n" , cp[6]);
ip = (int*) x;
printf("A)*ip = %x\n" , *ip);
ip = ip +1;
printf("B)*ip+1 = %x\n" , *ip);
printf("C)*cp[6] = %x\n" , cp[6]);
sp = sp +5;
printf("D)*sp +5 = %x\n" , *sp);
//change the content of x
*x = *cp + 2;
printf("E)*cp[1] = %x\n" , cp[1]);
printf("F)*cp[0] = %x\n" , cp[0]);
return 0;
}
输出:
y = 102
x[0] = 102
x[1] = 1112
x[2] = 2122
x[3] = 3132
x[4] = 4142
x[5] = 5152
1)*cp = 2
2)*sp = 102
3)*cp[3] = 11
3)*cp[6] = 32
A)*ip = 11120102
B)*ip+1 = 31322122
C)*cp[6] = 32
D)*sp +5 = 5152
E)*cp[1] = 0
F)*cp[0] = 4
答案 0 :(得分:1)
与x[0]
显示为102而不是0102几乎相同,您需要告诉printf
要打印多少个数字,否则它不会打印出前导0。因此,要获得最少2个以0开头的数字,您可以将%x
更改为%02x
,或者在x[0]
的情况下,将%04x
最少四位数。
printf("x[0] = %04x\n" , x[0]);
答案 1 :(得分:1)
我的答案假设short
的大小为2。我也忽略了代码破坏strict aliasing rule的事实(提高编译器优化级别,并且输出可能会更改)。
//change the content of x
*x = *cp + 2; // this changes *x to 0x0004
*x
在系统上的大小为2,因此分配它会同时修改cp[0]
和cp[1]
。
因此,预期输出为
E)*cp[1] = 0
F)*cp[0] = 4
或
E)*cp[1] = 4
F)*cp[0] = 0
取决于系统的字节序。