1

在下文中,我预计将打印 13。
我想将 arr (这是一个指向内存的指针,如果我理解一切正确的话,存储数组中的 int 值)按一个数组成员的大小,即 int。

而是打印 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;
4

3 回答 3

10

你的假设是错误的。它将指针向前移动 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为此目的使用。

于 2012-04-24T22:09:30.170 回答
4

arr + 4将从数组的起始地址为您提供 4 个项目,而不是 4 个字节。这就是为什么你得到 45,这是第零项加 4。

于 2012-04-24T22:10:58.100 回答
0

它正在执行指针运算。看到这个:http ://www.eskimo.com/~scs/cclass/notes/sx10b.html

arr是你的数组,它分解为第一个元素,然后你arr[0]将指针移动 4 个元素,因此它现在指向。1+ 4arr[4]45

于 2012-04-24T22:11:31.283 回答