簡體   English   中英

在帶有和不帶有“&”號的情況下獲取C中指針的地址,有什么區別?

[英]Obtaining address of pointer in C with and without ampersand, what's the difference?

我很難理解本指南中有關C指針的代碼 我以為您需要一個&符來引用一個指針的地址,但是指南的代碼設法在沒有一個的情況下獲得了它。 我修改了他們的代碼,做了一次更改,我將其注釋為“我的添加的行”。 該線與上方的線相同,但帶有“&”號。 這些行的評估會產生非常相似的值,但不會產生相同的值。 我的邏輯往哪里去?

謝謝Nakul

  #include <stdio.h>

int main () {

   int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

   printf("Address of var variable: %x\n", &var  );

   /* address stored in pointer variable */
   printf("Address stored in ip variable: %x\n", ip );

  /* MY ADDED LINE: address stored in pointer variable */
   printf("Address stored in ip variable: %x\n", &ip );


   /* access the value using the pointer */
   printf("Value of *ip variable: %d\n", *ip );

   return 0;

指針只是一個普通變量,將其他地址作為其值。 換句話說,一個指針指向可以找到其他內容的地址。 通常您會想到一個包含立即數的變量,例如int a = 5; ,指針將僅保存內存中存儲5的地址,例如int *b = &a;

作為普通變量,指針本身具有地址。 它的地址是變量本身的地址,而不是變量存儲的地址。 例如, char buf[] = "foo", *p = buf; 創建一個數組buf和用於在第一個字符分配地址buf由保持地址 p (例如p指向的第一個字符在buf )。 但是p本身在內存中有一個地址。 它是p的地址, buf第一個字符的地址保存在內存中。 一個簡短的示例可能會有所幫助:

#include <stdio.h>

int main (void) {

    char buf[] = "foo",
        *p = buf;

    printf ("address for buf      : %p\n"
            "address of 1st char  : %p\n"
            "address held by p    : %p\n"
            "address for p itself : %p\n",
            (void*)buf, (void*)&buf[0], (void*)p, (void*)&p);
}

使用/輸出示例

$ ./bin/pointeraddr
address for buf      : 0x7fffbfd0e530
address of 1st char  : 0x7fffbfd0e530
address held by p    : 0x7fffbfd0e530
address for p itself : 0x7fffbfd0e540

現在,讓我們仔細看看指針的內容和指針地址(指針的內容保存在內存中)。為簡單起見,我們僅使用地址中的最后三個數字。

char buf 數組存儲在內存中的什么位置?

    +---+---+---+---+
    | f | o | o | \0|   buf - array of char
    +---+---+---+---+
      5   5   5   5
      3   3   3   3
      0   1   2   3

訪問數組時,該數組將轉換為指向第一個元素的指針,但要遵循以下條件:

(p3)除非它是sizeof運算符, _Alignof運算符或一元'&'運算符的操作數,或者是用於初始化數組的字符串文字 ,否則類型為“ array of type”的表達式將轉換為類型為“指向類型的指針”的表達式,該表達式指向數組對象的初始元素,而不是左值。

C11標准-6.3.2.1其他操作數-左值,數組和函數指示符(p3)

buf數組中的第一個字符是什么? (答案: buf[0] )第一個字符的地址是什么(使用一元'&'運算符)? 它與buf的地址相同,但具有指向char的類型指針 (與buf並置,后者在訪問時是指向 char[4] 數組指針

p呢? 它有自己的地址,用於存儲buf第一個字符的地址,例如

    +---+  p - pointer to char
    | 5 |
    | 3 |  holds the address 0x7fffbfd0e530
    | 0 |
    +---+
      5
      4    stored at 0x7fffbfd0e540
      0

如何獲得p持有的地址中的值(字符)? 您使用一元解引用運算符*p 您如何獲得p持有的地址? p已經是一個指針,因此簡單地評估p本身就可以得到p持有的地址,例如

char *q = p;

q現在保存由p存儲的地址,該地址存儲在內存中創建q的新地址處。

或者,非常簡單地,要打印現在也由q持有的p的地址,只需將p (或q )轉換為(void*)並使用"%p" 轉換說明符進行打印,例如

printf ("address held by p & q : %p\n", (void*)p);

沒魔術 指針只是一個變量,將其他內容的地址作為其值。 與任何變量一樣,它具有自己的地址。 如果您以這種方式考慮,則始終可以弄清楚所擁有的東西以及需要做什么才能獲取存儲在該地址的值。

仔細檢查一下,如果您還有其他問題,請告訴我。

邏輯向南,因為“&”為您提供了一個指針(在您的情況下為指向該指針的指針)。 讓我用正確的術語來調整您的代碼,然后它應該變得清楚:

printf("Address stored in ip variable, pointing to
    the memory location of var: %x\n", ip );

printf("Address pointing to the (memory location / address)
    of pointer ip which itself contains the (memory location / 
    address) of var: %x\n", &ip );

你用過

int var = 20;
int *ip;
ip = &var;

並且您打印了&var, ip, &ip *ip

在這里, &varip將指示保存20的內存地址。 *ip將指示值20。最重要的是&ip 調用int *ip ,將創建此變量的存儲區。 所以ip占用一些內存區域。 當您打印&ip ,這將指示ip(contains the address of var)保存在的內存地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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