为什么这个 *ptr 不给出存储在 ptr 变量中包含的内存地址中的实际值?

Why does this *ptr NOT give the actual value stored at the memory address contained in ptr variable?

这是一个关于指针的基本 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,不是吗?因为 * 给出了存储在其操作数中存储的内存地址的实际值,对吗? 我错过了什么?

首先,

printf("Address of variable: %x\n", &variable);
printf("Address of variable: %x\n", pointerToVariable);

是错误的,因为你使用了错误的格式说明符导致 undefined behavior

要打印地址,您需要

  • 使用 %p 格式说明符
  • 将相应的参数转换为(void *)

然后,对于

printf("Address of variable: %x\n", *pointerToVariable);

语句,%x 格式说明符打印提供的整数值的十六进制表示,因此您得到了正确的输出。

1420HEX 值。

printf 格式说明符从 %x 改为 %d 以将 20 作为输出

printf("Address of variable: %d\n", *pointerToVariable);

此外,指针的正确格式说明符是 %p,因此

printf("Address of variable: %x\n", pointerToVariable);

必须

printf("Address of variable: %p\n", (void *)pointerToVariable);

您的格式是十六进制(以 16 为底)(%x) 此行:

printf("Address of variable: %x\n", *pointerToVariable);// 输出:14

如果您想要以 10 为基数的输出,则需要提供正确的格式:

 printf("Address of variable: %d\n", *pointerToVariable); // output : 20

// 1*16 + 4 = 20

祝你好运