присвоение указателя другому типу переменной

-6

У меня простая программа.

Вот код.

#include<stdio.h>
#include<conio.h>

int main(){
char c,*cc;
int i;
long l;
float f;

c='z';
i=15;
l=77777;
f=3.14;
cc=&c;

printf("c=%c cc=%u\n",*cc,cc);
cc=&i;
printf("i=%d cc=%u\n",*cc,cc);
cc=&l;
printf("l=%ld cc=%u\n",*cc,cc);
cc=&f;
printf("f=%f cc=%u\n",*cc,cc);

return (getch());
}

Поэтому, насколько мне известно, размер целого числа остается выше, чем char, поэтому, когда я назначаю целочисленную переменную указателю на char, он должен указывать только первый байт целочисленной переменной, потому что cc является указателем char. И поэтому, когда я запускаю вывод, только первая строка printf должна давать правильный вывод, другие строки должны печатать некоторые адреса или некоторые значения мусора.

Но в моем случае здесь вторая строка printf также дает правильное значение, которое составляет 15, я назначил целочисленную переменную, в то время как я думаю, что она должна давать значение для мусора. Расскажите мне, как это происходит?

вот мой вывод.

c=z cc=2686791
i=15 cc=2686780
l=-47 cc=2686776
f=0.000000 cc=4199093

спросил(а) 2013-09-23T07:46:00+04:00 7 лет, 9 месяцев назад
0
110

когда я назначаю целочисленную переменную указателю на char, он должен указывать только первый байт целочисленной переменной

Тогда почему удивительно, что вторая строка печатает 15? Число 15 помещается в один байт, наименее значащий байт int. И LSB - это точно байт с наименьшим адресом памяти, если ваша машина малозначительная (что, вероятно, и очевидно).

И используйте %p для печати указателей, %u для целых чисел без знака. Прочтите документацию printf().

ответил(а) 2013-09-23T07:52:00+04:00 7 лет, 9 месяцев назад
77

Макет байта целого числа 15 равен [0x0f][0x00][0x00][0x00], поэтому, когда вы разыскиваете cc вы получаете содержимое первого байта (что бывает 15).


Чтобы увидеть разницу, попробуйте случай i=1000 и вы увидите -24 (байт по адресу &i равен 0xe8, который является -24 при интерпретации как подписанный байт)

ответил(а) 2013-09-23T07:56:00+04:00 7 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема