C指针地址打印

时间:2014-01-14 02:08:36

标签: c++ c

我第一次学习C指针和地址以及如何在平板电脑上使用它们

让我们说:

int x = 1, y = 2;

int *ip; // declares *ip as an int type?

ip = &x; //assigns the address of x to ip?

y = *ip; //y is now 1 via dereferencing

所有评论解释都是正确的吗?

如果我打印ip的结果会怎么样?它会打印变量x的地址,例如

  

011001110

5 个答案:

答案 0 :(得分:29)

是。你的所有陈述都是正确的。但是在第一次

的情况下
int *ip;

最好说ip是指向int类型的指针。

  

如果我打印ip的结果会怎么样?

它将打印x的地址。

  

它会打印变量x的地址吗,比如

011001110  

没有。地址通常以十六进制表示。您应该使用%p说明符来打印地址。

printf("Address of x is %p\n", (void *)ip);  

注意:
请注意,在上面的声明中*不是间接运算符。相反,它指定p的类型,告诉编译器p是指向int指针。 *符号仅在出现在语句中时执行间接。

答案 1 :(得分:3)

int x = 1, y = 2;

int *ip; // declares ip as a pointer to an int (holds an address of an int)

ip = &x; // ip now holds the address of x

y = *ip; // y now equals the value held at the address in ip

答案 2 :(得分:2)

以下面的例子为例:

Initializer       x        y        ip
Memory Value      [1]      [2]      [1000]
Memory Address    1000     1004     1008

如你所见:

  1. x的值为1,地址为1000
  2. y的值为2,地址为1004
  3. ip的值为1000x的地址)和地址1008
  4. 请考虑以下事项:

    1. x == 1&x == 1000
    2. y == 2&y == 1004
    3. ip == 1000&ip == 1008以及*ip == 1x的值)
    4. 希望这可以帮助您直观地了解正在发生的事情。

答案 3 :(得分:0)

一切都正确。

第1行:您声明了两个变量

第二行:内存指针" ip"已定义

第3行:X的内存地址被赋予指针ip

第4行:Y现在设置为地址ip

处变量X的值

但是,内存地址采用十六进制格式。 011001110是数据字节而不是存储器地址。地址更像是0x000000000022FE38(可能更短)。考虑一下:

int x = 0;
int *ptr = &x; //the "&" character means "the address of"
printf("The variable X is at 0x%p and has the value of %i", (void *)ptr, x);

这将打印X的地址,而不是* ptr。您需要另一个指针来打印* ptr的地址。但这是毫无意义的,因为指针被定义为打印变量的地址。可以将其视为另一个变量的别名(它的值是该内存地址的值)。

答案 4 :(得分:0)

我喜欢原始发帖人的说法,即*ipint。这可以准确反映声明的语义,其中声明符*ip是一个表达式,而声明说明符(在这种情况下为int)提供了表达式的类型。通过这种方式说明含义可以深入了解int *ip, q;之类的含义,其中q只是int。您可能不希望使用这种更正式的方式来说明对话中的类型,但有助于查看声明所表示的基础结构。