Почему это *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

Удачи

Другие вопросы по тегам