我刚刚学习了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;
}
我期望有两个输出,分别是 一样. 谁能解释一下为什么输出不同?
一个指针变量和其他变量一样,有自己的地址。 它可以存储地址的事实并不能改变这一点。
变量 n
有一个地址(例如,100)存储一个类型为 int
,在本例中为60。
变量 p
也有一个地址(例如,104),并存储一个类型为 int *
在这种情况下,该地址为100,即为 n
.
同样,变量 pp
具有一个地址(例如108),并存储一个类型的值。int **
在这种情况下,它的地址是104,也就是以下地址 p
.
&p
的地址。p
.
p_p
的地址。p
根据定义 int **p_p = &p;
.
*p_p
是事情 p_p
指的是: 由于 p_p
指向 p
, *p_p
是 p
.
当您打印 &p
的地址,它打印的是 p
.
当您打印 p_p
的地址,它打印的是 p
.
当您打印 *p_p
的值,它打印出 p
的地址,也就是 n
.
指针和其他变量一样是一个变量,因此它需要被存储,指针的地址就是存储指针的内存位置的地址。
指针的值就是它所指向的变量的地址,所以指针的值是 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
.
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 *
*---------------------------------------------------------*
**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
#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;
}
``````````````````````