为了解释数组只是我们班级的指针(在C ++中),我的教授向我们展示了这一点:
array[5] // cout'ing this
*(array + 5) // would return the same value as this
我完全理解它有点麻烦。这是我的想法:
array
是第一个位置的地址,因此如果我们向该地址添加5,我们将在内存中移动5个地址。指针运算符从内存位置提取数据。
这是正确的想法吗?这个想法对我来说仍然感到模糊,只是觉得我完全不明白。我想听到别人解释它可能会帮助我更多地理解它。提前谢谢!
答案 0 :(得分:4)
你有正确的想法。
数组隐式地转换为指针。有趣的是,[]
适用于指针,而非数组。
[b]
下标运算符定义为*(a + (b))
。 []
用作语法糖 - 写array[5]
代替*(array + 5)
带指针和整数p + i
的指针算法将p
的地址增加i * sizeof(*p)
个字节。
char* p;
p + 5; // address increased by 5
int* p;
p + 5; // address increased by 20 as sizeof(*p) is 4
*
运算符执行间接寻址。它将为您提供指针所指向的内容。
int x[2];
int* p = &x[0]; // could also be int* p = x;
*p = 5; // x[0] is now 5
*(p + 1) = 10; // x[1] is now 10
答案 1 :(得分:4)
你的教授是正确的,这两个表达式会产生相同的结果。你对它的解释让我相信你已经很好地掌握了这些机制。
说数组与指针相同是不正确的。 一个数组非常容易转换为指针,这会导致一些混乱。
例如,请考虑以下代码:
int array[5];
int * pointer = new int[5];
cout << sizeof(array); // outputs 5*sizeof(int), most probably 20
cout << sizeof(pointer); // outputs sizeof(int*), most probably 4 on a 32 bit OS
array[4] = 906;
pointer[4] = 906;
cout << *(array + 4) << *(pointer + 4); // outputs "906 906"
答案 2 :(得分:2)
来自c ++中的内存数组是程序连续内存的一部分。这就是为什么你可以去*(array + 5),因为它是数组前面的5。
还要记住,C ++中的数组从@ 0开始,因此数组中的第6个元素是数组[5] 示例
[0] [1] [2] [3] [4] [5] Array index
1 2 3 4 5 6 Item number
要访问第2项,你会
但请记住,数组[index_number]是查找数组中项目的标准语法,因此请确保使用array[index_num]
代替*(array + index_num)
答案 3 :(得分:2)
是的,你的教授说的是正确的。
详细解释
考虑你的阵列,
int array[5]
这里需要内存中的5个位置说0x00 0x04 0x08 0x0C和0x10 0x14
假设整数占用4个字节,则位置相隔4个字节。
这种情况'array'表示数组的基址(指针),即0x00。而a的类型将是int *。 (因为数组元素的类型是整数)
如果你做数组+ 1,它将是0x04,因为指针的增量取决于指针的类型。如果指针是整数,它将增加4个字节。如果整数的类型是字符,则指针将增加一个字节。
所以,如果你这样做(数组+5),它将指向地址0x14和
*(array+5)
返回位置0x14的值,即位于数组的第5个位置的值。
所以实际上,array [5]等于*(array + 5)
编译器在内部将array [5]转换为*(array + 5)
所以即使我们写5 [数组],它也会被转换为*(5 +数组)
虽然看起来很奇怪,但这就是5 [array]与array [5]
相同的原因