有人可以向我澄清这个数组/指针的想法吗?

时间:2011-11-21 04:31:14

标签: c++ arrays pointers

为了解释数组只是我们班级的指针(在C ++中),我的教授向我们展示了这一点:

array[5]      // cout'ing this 
*(array + 5)  // would return the same value as this

我完全理解它有点麻烦。这是我的想法:

array是第一个位置的地址,因此如果我们向该地址添加5,我们将在内存中移动5个地址。指针运算符从内存位置提取数据。

这是正确的想法吗?这个想法对我来说仍然感到模糊,只是觉得我完全不明白。我想听到别人解释它可能会帮助我更多地理解它。提前谢谢!

4 个答案:

答案 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项,你会

  • 阵列[1]
  • *(数组+ 1)

但请记住,数组[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]

相同的原因