-1

我刚研究C语言中的指针,我想知道指针的地址是什么,在网上搜索后,我写了这段代码。

#include <stdio.h>

int main() {
    int n = 60;
    int *p = &n;
    int **p_p = &p;
    printf("%p\n", *p_p);
    printf("%p", &p);
    return 0;
} 

我期望两个相同的输出。谁能解释为什么输出不同?

4

6 回答 6

1

指针和其他变量一样是变量,因此需要存储,指针的地址是存储指针的内存位置的地址。

指针的值是它指向的变量的地址,所以 的值p是 的地址,n的值p_p是 的地址p

当您取消引用时,p_p您得到的值p不是 的地址p,而 的值p是 的地址n的值*p_p是 的地址n

所以

printf("%p\n", *p_p);
printf("%p\n", p);
printf("%p", &n);

将打印完全相同的值,即n.

打印&p将打印 的地址p

于 2020-06-08T17:01:02.373 回答
1
#include <stdio.h>

int main() {
    int n = 60;
    int *p = &n;
    int **p_p = &p;
    printf("%p\n", *p_p); //means the value inside of pointer p which means(address of n)  
    printf("%p\n", p_p);// address of pointer p
    printf("%p", &p); // also address of pointer p
    return 0;
} 
``````````````````````
于 2020-06-08T17:31:03.917 回答
1

指针变量有自己的地址,就像任何其他变量一样。它可以存储地址的事实并没有改变这一点。

该变量n有一个地址(例如,100),它存储一个类型的值int,在本例中为 60。

该变量p还有一个地址(例如,104)并存储一个类型的值int *,在这种情况下为 100,即 的地址n

类似地,变量pp有一个地址(例如,108)并存储一个类型的值int **,在这种情况下为 104,即 的地址p

于 2020-06-08T17:06:14.947 回答
1

&p是 的地址p

p_pp由于定义,是 的地址int **p_p = &p;

*p_p是东西p_p指向。既然p_p指向p*p_p就是p

当您打印&p时,它会打印 的地址p

当您打印p_p时,它会打印 的地址p

当您打印*p_p时,它会打印 的值p,即 的地址n

于 2020-06-08T17:13:52.760 回答
0

pointersdata type就像C 编程语言中的任何其他语言一样。pointers有名称和值,当它们出生时,我们可以初始化它们或不初始化它们。

中的特殊属性pointers是它们的。它们被指定保存/包含address其他数据类型,但这与它们也是存在于内存/ram中某个地址的变量这一事实并不矛盾!

考虑下面的代码片段:

int x = 10;

x是数据类型,他的类型是整数,它的值是10

int* p_x = &x; 

p_x是数据类型,他的类型是int*pointer to int),他的值是x的地址(&x

int* p; 

p是数据类型,他的类型是int*pointer to int),他的值是未知的(系统中的有效地址)。这真是太糟了。它调用了dangling pointer第一条规则,当您声明一个指针时,您会立即对其进行初始化(NULL如果您在声明时没有用于初始化的有效地址,则经常使用它)。请考虑编译器很聪明,可以将未初始化的指针初始化为null. 但永远不要对此进行转发。

int** p_px = &p_x;

p_px是数据类型,他的类型是int**( pointer to int*, OR pointer to int pointer ),他的值是 p_x ( &p_x)的地址,p_x在 ram 中可以找到。

让我们看一下 RAM 中上述变量的说明:

*---------------------------------------------------------*
*      Address       |      Value         |    var Name   *
*---------------------------------------------------------*
* 0x7fff4ee2095c     |       10           |      x        *
*---------------------------------------------------------*
* 0x7fff4ee20960     |  0x7fff4ee2095c    |     p_x       *
*---------------------------------------------------------*
* 0x7fff4ee20968     |   0x7fff4ee20960   |     p_px      *
*---------------------------------------------------------*
于 2020-06-08T19:58:24.797 回答
0

**p_p=&p 这意味着 p_p 是指向指针的指针,所以如果你只打印 p_p 它会给你它里面的值,这意味着指针 p 的地址,但是如果你打印 *p_p 它意味着指针 p 里面的值,这意味着地址n 所以如果你想用不同的两种方法打印指针 p 的地址

printf("%p\n", p_p);// address of pointer p
 printf("%p", &p); // also address of pointer p

printf("%p\n", *p_p); // the value inside of pointer p which means (address of n)
`````````````
 means the value inside pointer p which means address of n

于 2020-06-08T17:28:43.410 回答