Этот маленький указатель C смутил меня - PullRequest
0 голосов
/ 30 августа 2018

Это полностью рабочий код, и только одна строка этого кода смутила меня, и я этого не понимаю.

Как и почему 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

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В моем ответе предполагается, что short имеет размер 2. Я также игнорирую тот факт, что код нарушает правило строгого псевдонима (поднимите уровень оптимизации компилятора, и выходные данные могут измениться).

//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

в зависимости от порядкового номера системы.

0 голосов
/ 30 августа 2018

Аналогично тому, как x[0] отображается как 102, а не 0102, вам нужно указать printf, сколько цифр вы хотите напечатать, так как в противном случае они не будут печатать первые 0. Таким образом, чтобы получить как минимум 2 цифры, напечатанные с ведущими нулями, вы должны изменить %x на %02x или в случае x[0] вы бы поставили %04x как минимум на 4 цифры.

printf("x[0] = %04x\n" , x[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...