[英]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++;
}
...
}
實際上,當一個數組 '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.