C语言中的&p和*p_p有什么区别?

问题描述 投票:0回答: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;
} 

我期望有两个输出,分别是 一样. 谁能解释一下为什么输出不同?

c pointers types addressof
1个回答
1
投票

一个指针变量和其他变量一样,有自己的地址。 它可以存储地址的事实并不能改变这一点。

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

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

同样,变量 pp 具有一个地址(例如108),并存储一个类型的值。int ** 在这种情况下,它的地址是104,也就是以下地址 p.


1
投票

&p 的地址。p.

p_p 的地址。p根据定义 int **p_p = &p;.

*p_p 是事情 p_p 指的是: 由于 p_p 指向 p, *p_pp.

当您打印 &p的地址,它打印的是 p.

当您打印 p_p的地址,它打印的是 p.

当您打印 *p_p的值,它打印出 p的地址,也就是 n.


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.


1
投票

pointers 是像任何其他 data type 在C语言编程中。pointers 有名字和值,当它们出生时,我们可以对它们进行初始化或不初始化。

中的特殊属性 pointers 是他们 价值观. 它们被指定为持有 address 但这并不违背它们也是住在 memoryram 中特定地址的变量的事实!

请看下面的代码片段。

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*, 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      *
*---------------------------------------------------------*

0
投票

**p_p=&p 它的意思是p_p是指针的指针 所以如果你只打印p_p,它就会给你里面的值,也就是指针p的地址 但是如果你打印*p_p,它的意思是指针p里面的值,也就是nso的地址 如果你想用不同的两种方法来打印指针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


0
投票
#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;
} 
``````````````````````
© www.soinside.com 2019 - 2024. All rights reserved.