簡體   English   中英

C ++中的指針數組

[英]Array of pointers in c++

如果iptr是數組指針,則**(iptr+3)*iptr[3]之間沒有任何區別。

不,而且令人驚訝地(或不是),它也等效於*(3[iptr])

**(iptr+3)*iptr[3]之間沒有什么相同,因為

*iptr[3]是表示數組中地址為3的元素的指針

**(iptr+3) ,就像iptr比其**(6)大3

對於編譯器,不,沒有區別。 兩種形式最終都訪問相同的元素。

但是,如果您正在為編譯器編寫代碼,那么您的受眾是錯誤的。 您的代碼應該寫成好像下一個要維護它的人是知道您住的地方的精神病患者。

換句話說,代碼具有可讀性和可維護性,並且讓編譯器本身擔心優化(a) 為此,我總是更喜歡array[index]形式而不是*(array+index)形式,因為前者明確了意圖:訪問數組元素。


(a)當然,與大多數規則一樣,也有例外。 但是,與大多數例外情況一樣,它們之間的關系很少而且相去甚遠,因此該建議是有效的。

由於指針運算,它是相同的。

假設您有一個自定義類型

typedef struct
{
     /* add some parameters here */
} MyStruct;

然后創建這種類型的向量

MyStruct xMyStructArray[20];

例如,當您要訪問第三個元素時,可以通過以下方式之一進行操作:

MyStruct xValue = xMyStructArray[2]; // index starts from zero
MyStruct xValue = xMyStructArray + 2;

僅xMyStructArray被視為指向第一個數組元素的指針。

xMyStructArray ==&(xMyStructArray [0])

C / C ++在連續的內存單元中創建一個數組,當您使用[]運算符時,您告訴它從對應於第一個數組元素地址的指針地址開始訪問該數組的相應單元。 因此它知道您的類型大小,然后轉到正確的地址。

指針算法的工作原理相同。 當您對一個指針求和1時,編譯器將檢查與該指針對應的類型的大小,然后轉到與該類型兼容的內存中的下一個位置。

兩者相同,Compiler只會將iptr[3]3[iptr]視為*(iptr+3)*(3+iptr)

int a[5][10] = {0}; 考慮這個二維數組。 這里a[i][j]表示*(*(a+i) + j) ,所以我們可以像i[a][j]那樣寫,也意味着*(*(i + a) + j)

但是i[j][a]是錯誤的,因為它將被視為*(*(i + j)+a)這是錯誤的。 *(i+j)會導致崩潰(不確定的行為)。

暫無
暫無

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

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