在下面我预计会打印13张。
我想通过一个数组成员的大小(即int)来移动arr(这是一个指向内存的指针,其中存储了数组中的int值,如果我理解了一切)。
而是打印45。因此,检索第五个Array成员进行一个数组成员范围的跳转。为什么呢?
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 :(得分: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
用于此目的。
答案 1 :(得分:4)
arr + 4
将从数组的起始地址给出4个项目,而不是4个字节。这就是为什么你得到45这是第0项加上4。
答案 2 :(得分:0)
执行指针运算。请参阅:http://www.eskimo.com/~scs/cclass/notes/sx10b.html
arr
是你的数组,它会分解为第一个元素arr[0]
,它将是1
,然后你+ 4
分配给它,它将指针移动4个元素{{ 1}}所以它现在指向arr[4]
。