簡體   English   中英

使用C或C ++中的多個地址運算符初始化指針指針

[英]Initialize pointer to pointer using multiple address operators in C or C++

它只是發生在我身上我不知道如何使用C ++中的一個語句初始化指向非指針值的指針:

int a = 1;
int** ppa = &&a; //Does not compile
int** ppa = &(&a); //Does not compile
int* pa = &a;   //Works but is a
int** ppa = &pa; //Two step solution

我錯過了什么,是兩個聲明唯一的方法嗎?

你不能獲得指向臨時的指針。 &a得到r值。 允許沒有實際地址。

如果你想要一個指向指針的指針,你想要指向的指針必須位於內存中的某個位置,所以我認為不能有“一步解決方案”,因為你需要一個可以指向的指針變量。

(注意:這句話並不是指在一句話中盡可能經常使用“點”的語言試驗:-))

其他許多都是正確的:指向指針的指針必須指向某個東西。 但是,在C99中,您可以使用復合文字作弊:

int a = 1;
int **ppa = &(int *){ &a };

復合文字只是基本上未命名的對象,並且具有與普通對象相同的存儲規則。 (但是你不能用static關鍵字給函數范圍復合文字靜態存儲持續時間)。 您甚至可以嵌套它們,以便您可以將前一個示例重寫為一行:

int **ppa =  &(int *) { &(int) { 1 } };

C ++ 03 [ Section 5.3.1 ]說

一元&運算符的結果是指向其操作數的指針。 操作數應為左值或限定ID。 在第一種情況下,如果表達式的類型是“T”,則結果的類型是“指向T的指針”。

&&a&運算符不能應用於&a的結果,因為結果不是lvalue

也讀這個帖子

你想要一個指針(稱之為PP )指針(稱之為P )?

那么P必須存在。 這意味着你必須聲明它。

當然編譯器會在&&a失敗 - 因為你不能獲取地址的地址。 可以獲取指針的地址 - 但你必須先聲明指針。

從而:

int a = 1;
int *P = &a;
int **PP = &P;

地址是一個數字。 如果它保存在變量(即指針)中,它只有一個自己的地址。 所以

int *i1 = &a;

有道理,但是

int **i2 = &&a;

沒有意義。 然而

int **i2 = &i1;

確實有意義。 合理?

執行以下操作時:

char a;
char* b = &a;
char** c = &b;

首先,現在存在於堆棧中。 它顯然有一個內存地址(即它的堆棧位置),這是你分配給b的內容。 b現在也存在於堆棧中,然后您可以將其內存地址傳遞給c。 但是,如果沒有中間堆棧,則不能獲取值的地址地址,因為如果沒有先顯式創建它,它就不存在。

當你做像&&a;這樣的問題時&&a; 是,你問“的地址的地址a ”。

這沒有意義。 我們可以得到a正常的地址,但這並沒有給我們一個變量,我們可以采取的地址。 它只是給我們一個指針值。 直到該值存儲在某個地方,我們才能接受它的地址。

如果您有2+2等代碼,則結果也沒有地址。 它只是值4,但它尚未存儲在任何地方,因此我們無法獲取地址。 一旦我們將它存儲到int變量中,我們就可以獲取該變量的地址。

基本上,問題是值和變量之間的差異。 值只是一個數字(或一個字符,或一些其他數據)。 變量是存儲器中存儲值的位置。 變量具有地址,但值不具有。

在C ++中 - 說,它是rvalues和lvalues之間的區別。 右值本質上是一個臨時值,它通常是從另一個操作(例如您的情況下的&運算符)返回的值,但尚未存儲在任何位置。

將它存儲到變量中后,您將得到一個左值,並且左值有一個您可以使用的地址。

所以是的,你需要兩個單獨的陳述。 首先,您獲取地址,然后將該地址存儲在某處。 然后你可以把這個“某個地方”的地址。

這可能有效:

int ** ppa =&(int *){&a};

暫無
暫無

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

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