2015-12-30 5 views
-1

я напечатал в этом коде:Что хранит переменная указателя?

char *a; 
char b = 'd'; 
a = b; 
printf("%c", a); 

Выход - 'D'.

Мой запрос состоит в том, что поскольку a является переменной указателя, он должен хранить адрес. Почему в этом случае он хранит значение символа?

+2

Вы только что изменил значение указателей на значения ASCii а. – loginn

+0

Ваш компилятор * должен * пожаловаться на назначение, по крайней мере; присвоение целочисленного значения объекту-указателю является нарушением * ограничения *. Обратите внимание, что gcc также жалуется на инструкцию 'printf', поскольку тип' a' ('char *') не является тем, что ожидает спецификатор преобразования '% c' (' char'). –

+0

Нет, в моем компиляторе gnu gcc нет предупреждений –

ответ

7

так a переменная указатель, он должен сохранять адреса

Переменная указатель может хранить числовые значения, тоже. В большинстве систем указательная переменная могла хранить int, хотя явной гарантии этого не существует. Однако переменная указателя способна хранить значение типа char во всех системах.

то почему в этом случае он хранит значение символа?

Потому что вы сказали это сделать. Сохранение значения в указателе не делает это значение адресом.

Примечание: ваш код имеет неопределенное поведение. Причина, по которой код производит вывод, который вы ожидаете, заключается в том, что представление указателя в вашей системе совместимо с представлением int, которое ожидает %c.

+0

Хороший ответ ... Единственное, чего не хватает, так это то, что адрес 'b' написан как' & b' (например, «возможно, вы хотели написать« a = & b; '?» ...). Кроме того, поскольку ОП путается в этом вопросе, какой ресурс он использует, чтобы научиться, очевидно, не работает, и ему, вероятно, следует попробовать K & R2e ... – Sebivor

+0

Исправление: если вы собираетесь это вывести, вы также можете захотеть воспитывать '% p' ... Так много узнать, так мало книг ... – Sebivor

+1

Я использую ANSI C от E Balaguruswamy. И я хотел написать b, а не & b. Я знаю разницу между ними. –

0

Указатель - это переменная, которая хранит адрес другой переменной. Но здесь вы написали a = b, что означает, что вы предоставляете символ d, на который будет храниться store.this, потому что указатель также является переменной.it также имеет собственное адресное пространство. В то время как мы указываем адрес другой переменной, указатель сохраняет этот адрес, который означает, что указатель имеет емкость хранения. но в этой программе вы не можете разыменовать указатель. Вы получите ошибку сегментации.

0

Говоря со ссылкой на C, переменная-указатель сохраняет адрес переменной, на которую указывает. В C мы не можем использовать его, как и любую другую обычную переменную, для хранения других типов данных. Кроме того, тип данных переменной-указателя - это переменная, указывающая на или если мы объявляем ее как void, нам нужно ее использовать в соответствии с необходимостью (т. Е. Тип данных указательной переменной).

Говоря о вашем запросе, так как вы уже объявили его как «указательную переменную», поэтому функция «printf» предназначена для печати данных, на которые указывает указатель.

0

Хотя ваш вывод кода работает, исходя из причин, по которым @dasblinkenlight сказал, что это неправильная практика назначения charchar*. Предупреждение компилятора (GCC 4.8.4) также полезно, чтобы понять проблему:

warning: assignment makes pointer from integer without a cast [enabled by default] 
    a = b; 
    ^

При назначении int в int* отпечатки компилятора такое предупреждение. Это также относится и к char и char* таким же образом, потому что char является формой int в С.

Смежные вопросы