簡體   English   中英

*(Pointer + Index) 和 Pointer[] 的區別

[英]Difference Between *(Pointer + Index) and Pointer[]

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];

*(myPointer + index)myPointer[index]之間有什么功能區別嗎? 哪個被認為是更好的做法?

在功能上,它們是相同的。

語義上的指針引用說,“這是一件事,但我真正關心的事情X空間了”,而數組訪問說:“這里有一堆東西,我關心的Xth之一。”

在大多數情況下,我更喜歡數組形式。

之間沒有區別

*(array+10); //and
array[10];

但猜猜怎么了? 因為+可交換的

 *(10 + array); //is all the same
 10[array]; //! it's true try it !

不,它們在功能上是等效的。

首先, index被放大到類型大小,然后添加到myPointer基數,然后從該內存位置提取值。

“更好的實踐”是更具可讀性的一種,通常但不一定總是myPointer[index]變體。

那是因為您通常對數組的元素感興趣,而不是要取消引用的內存位置。

我知道沒有任何功能差異,但myPointer[1]形式最終更具可讀性,並且發生編碼錯誤的可能性要小得多。

直流電

*(myPointer + 1)形式不允許更改指向對象的指針類型,因此無法訪問重載的 [] 運算符。

調試也更難

 int *ints[10];
 int myint = ints[10]; 

視覺上更容易拾取

 int *ints;
 int myint = *(ints + 10); 

編譯器還可以插入范圍檢查以在編譯時捕獲錯誤。

直流電

更具可讀性和可維護性的代碼是更好的代碼。

至於功能部分……沒有區別。 兩次你都在“玩記憶”。

沒有功能差異。 使用任何一種形式的決定通常取決於您使用它的上下文。 現在在這個例子中,數組形式更易於使用和閱讀,因此是顯而易見的選擇。 但是,假設您正在處理一個字符數組,例如,使用句子中的單詞。 給定一個指向數組的指針,您可能會發現使用第二種形式更容易,如下面的代碼片段所示:

int parse_line(char* line) 
{
    char* p = line;
    while(*p)
    {
         // consume
         p++;
    }
    ...
}

編輯 1:十年前的問題。 但是,我仍然認為這個答案將有助於了解編譯器的觀點。

編譯器為這兩種情況創建相同的機器代碼。 這是一個證明,

代碼 1

#include<stdio.h>

int main()
{

    int myArr[5] = {1, 2, 3, 4, 5};
    int value = myArr[0];

}

代碼 2

#include<stdio.h>

int main()
{

    int myArr[5] = {1, 2, 3, 4, 5};
    int value = *(myArr + 0);

}

下面是對通過使用 gcc -S 編譯兩個代碼的 C 代碼生成的匯編代碼所做的比較結果。

這是證據

實際上,當一個數組 'a' 被初始化時,一個指向它的第一個內存位置的指針即.. a[0] 被返回,它只是 a ;

所以如果你做 'a+1' 它實際上是一個指向 a[1] 的指針

如果你做 'a+2' 它實際上是一個指向 a[2] 的指針

如果你做 'a+3' 它實際上是一個指向 a[3] 的指針等等,

所以如果你這樣做 *(a+1) 你會得到 a[1] 的值,其他值也類似。 如果你這樣做 *(a) 你實際上得到了一個 [0],所以我認為它現在很清楚它是如何工作的..

暫無
暫無

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

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