我刚研究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;
}
我期望两个相同的输出。谁能解释为什么输出不同?
指针和其他变量一样是变量,因此需要存储,指针的地址是存储指针的内存位置的地址。
指针的值是它指向的变量的地址,所以 的值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
。
#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;
}
``````````````````````
指针变量有自己的地址,就像任何其他变量一样。它可以存储地址的事实并没有改变这一点。
该变量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
。
pointers
data 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 *
*---------------------------------------------------------*
**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