2012-04-24 64 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