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

时间:2017-03-30 06:15:08

标签: c pointers printf format-specifiers conversion-specifier

这是关于指针的基本C程序:

sed -e "s/^M//" filename > newfilename

这会产生以下输出:

#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 应该打印20,不应该吗?因为*pointerToVariable给出了存储在其操作数中的内存地址的实际值,对吧? 我错过了什么?

3 个答案:

答案 0 :(得分:1)

首先,

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格式说明符打印所提供的整数值的十六进制表示,因此您在那里得到了正确的输出。

答案 1 :(得分:1)

14HEX的{​​{1}}值。

20格式说明符更改为printf而不是%d,以%x作为输出

20

此外,指针的正确格式说明符为printf("Address of variable: %d\n", *pointerToVariable); ,所以

%p

必须是

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

答案 2 :(得分:1)

您的格式为十六进制(基数为16)(%x)此行:

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

如果您想要输出10,那么您需要提供正确的格式:

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

// 1*16 + 4 = 20
祝你好运