[英]Address of NULL pointer
在下面的程序中,我通過為其分配 NULL 創建了一個 *ptr。 據我所知,*ptr=NULL; 意思是, *ptr 沒有指向任何東西。 如果是這種情況,為什么 ptr 和 &ptr 給出不同的結果?
#include<stdio.h>
int main() {
int *ptr=NULL;
printf("%p \n",ptr);
printf("%p \n",&ptr);
}
輸出:
0
0x7fff3415dc40
指針變量是一個對象,可以指向另一個對象。 這里int *ptr = NULL;
將ptr
聲明為一個指針對象,它可能指向一個int
對象。
最初存儲到這個指針對象中的NULL
是NULL
(它被初始化為NULL
,所以ptr
不指向任何對象)。
現在, ptr
也駐留在內存中。 它需要足夠的字節來包含指向對象的地址。 所以它也需要一個地址。 因此
ptr
計算為ptr
指向的對象地址。&ptr
計算ptr
對象本身在內存中的位置*ptr
計算為ptr
指向的對象的值,如果它指向一個對象。 如果它不指向對象,則行為未定義。 此外, %p
需要一個void *
作為相應的參數,因此打印它們的正確方法是
printf("%p\n", (void *)ptr);
printf("%p\n", (void *)&ptr);
ptr
保存您分配的值NULL
。
&ptr
是變量ptr
的地址,在您的情況下是0x7fff3415dc40
指針是地址。 這樣的地址需要存儲空間。 所以一個指針存儲在一個特定的地址。 所以 &ptr 是存儲指針的地方,ptr 是它指向的值。 所以你的指針地址是 0x7ff...,它的值是空的,現在是零。
打印指針時,您應將其轉換為void指針,如:
printf("%p \n",(void*)ptr);
^^^^^^^
兩個語句之間的區別在於第一個打印ptr
的值 ,第二個打印ptr
的地址
考慮以下代碼:
int n=10;
printf("%d \n", d);
printf("%p \n", (void*)&d);
第一個printf
打印值10,第二個打印變量d
的地址,你可能不會感到驚訝
用指針變量做同樣的事情也是一樣的。 首先,您通過指針變量打印值hold,然后打印指針變量的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.