2012-04-24 63 views
1

在以下我預期要打印13。
我想通過一個數組成員的大小(它是int)來移動arr(這是一個指向內存的指針,其中存儲了來自數組的int值,如果我理解了所有內容)。C++通過移動指針通過數組導航

而是打印45。因此,取而代之的是創建一個數組成員範圍跳轉的第5個數組成員。爲什麼?

int arr[] = {1,13,25,37,45,56}; 
int val = *(arr + 4);   //moving the pointer by the sizeof(int)=4 
std::cout << "Array Val: " << val << std::endl; 
+0

這與數組的標準指針算術的行爲有關。更多可以發現[這裏](http://www.tutorialspoint.com/cprogramming/c_pointer_arithmetic.htm) – RBT 2016-09-13 02:16:15

回答

8

你的假設是錯誤的。它將指針向前移動4個元素,而不是前面4個字節。

*(arr + 4)就像是在說邏輯*(arr + 4 * sizeof (arr [0]))

該聲明*(arr + 4)相當於arr [4]。儘管如此,它的確使用了一些整齊的語法,因爲*(4 + arr)同樣有效,意思也是4 [arr]

你的行爲可以通過下面的例子來實現:

#include <iostream> 

int main() 
{ 
    int a[3] = {65,66,67}; 
    char *b = reinterpret_cast<char *>(a); 
    std::cout << *(b + sizeof (int)); //prints 'B' 
} 

我不會建議使用reinterpret_cast爲此,雖然。

+0

所以這是一個語法的東西? '(arr + x)'訪問數組?那我該如何改變內存地址呢? – Skip 2012-04-24 22:12:59

+0

'arr + x'部分是指針算術規則的一部分。 'arr + 1'前進到'arr'指向的類型的下一個元素。 – chris 2012-04-24 22:15:23

+0

啊哈 - 這個我想明白。如果指針的類型是'void *',會發生什麼? – Skip 2012-04-24 22:16:17

4

arr + 4會從數組的起始地址給你4項,而不是4字節。這就是爲什麼你得到45這是第零件加4。

0

它正在執行指針算術。看到這一點:http://www.eskimo.com/~scs/cclass/notes/sx10b.html

arr是陣列,並且這個分解的第一個元素arr[0]這將是1,那麼你+ 4它由哪4個元素arr[4]所以它現在指向45移動指針。

+0

那麼它應該是5?因爲4加上first_array_element(它是1)應該是5? – Skip 2012-04-24 22:15:15

+0

@Skip不,你的陣列由整數,當你增加要移動的指針您不將4與第一元件'INT VAL =的值的下一個元素的指針(* ARR)+ 4;'這會產生5,因爲你解引用第一個元素是1,然後添加4你正在做的是增加指針4位置 – EdChum 2012-04-24 22:18:06