簡體   English   中英

空指針地址

[英]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對象。

最初存儲到這個指針對象中的NULLNULL (它被初始化為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM