Почему это *ptr НЕ дает фактическое значение, сохраненное по адресу памяти, содержащемуся в переменной ptr?
Вот основная программа на C для указателей:
#include <stdio.h>
int main() {
int variable = 20;
int *pointerToVariable;
pointerToVariable = &variable;
printf("Address of variable: %x\n", &variable);
printf("Address of variable: %x\n", pointerToVariable);
printf("Address of variable: %x\n", *pointerToVariable); // * is the DEREFERENCING OPERATOR/INDIRECTION OPERATOR in C.
//It gives the value stored at the memory address
//stored in the variable which is its operand.
getchar();
return 0;
}
Это дает следующий вывод:
Address of variable: 8ffbe4
Address of variable: 8ffbe4
Address of variable: 14
Но *pointerToVariable
должен печатать 20, не так ли? Так как *
дает фактическое значение, хранящееся по адресу памяти, хранящемуся в его операнде, верно? Что мне не хватает?
3 ответа
14
это HEX
ценность 20
,
+ Изменить printf
спецификатор формата для %d
вместо %x
иметь 20
как вывод
printf("Address of variable: %d\n", *pointerToVariable);
Более того, правильный указатель формата для указателей %p
, так
printf("Address of variable: %x\n", pointerToVariable);
должно быть
printf("Address of variable: %p\n", (void *)pointerToVariable);
Прежде всего,
printf("Address of variable: %x\n", &variable);
printf("Address of variable: %x\n", pointerToVariable);
неправильно, потому что вы использовали неправильный спецификатор формата, который вызывает неопределенное поведение.
Чтобы распечатать адрес, вам нужно
- использование
%p
спецификатор формата - привести соответствующий аргумент к
(void *)
Тогда для
printf("Address of variable: %x\n", *pointerToVariable);
заявление, %x
спецификатор формата печатает шестнадцатеричное представление предоставленного целочисленного значения, так что вы получите правильный вывод там.
Ваше форматирование шестнадцатеричное (база 16) (%x) этой строки: printf("Address of variable: %x\n", *pointerToVariable);
// вывод: 14
Если вы хотите вывод в базе 10, то вам нужно обеспечить правильное форматирование:
printf("Address of variable: %d\n", *pointerToVariable); // output : 20
// 1*16 + 4 = 20
Удачи