有人能澄清这个数组/指针的想法给我

Can someone clarify this array/pointer idea to me?

本文关键字:指针 数组      更新时间:2023-10-16

为了解释数组只是指向我们类的指针(在c++中),我的教授向我们展示了这个:

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

完全理解它我有点困难。以下是我的想法:

array是第一个位置的地址,所以如果我们在这个地址上加5,我们在内存中移动了5个地址。指针操作符从内存位置提取数据。

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

你的想法是对的。

数组隐式转换为指针。有趣的是,[]作用于指针,而不是数组。

a [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

你的教授是正确的,这两个表达式将产生相同的结果。你对它的解释使我相信你对机制掌握得很好。

说数组和指针是一样的是不完全正确的。数组很容易转换为指针,这会导致一些混淆。

例如:

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"

来自c++中的内存数组是程序的连续内存段。这就是为什么你可以用*(array + 5),因为它距离数组的前面是5。

还要记住,c++中的数组从@ 0开始,因此数组中的第6个元素是array[5]示例

[0] [1] [2] [3] [4] [5] Array index
 1   2   3   4   5   6  Item number

要访问项2,你可以

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

但请记住array[index_number]是在数组中查找项目的标准语法,所以请确保使用array[index_num]而不是*(array + index_num)

是的,你的教授说的是对的。

详细解释

考虑你的数组

int array[5]

这里它占用了内存中的5个位置0x00 0x04 0x08 0x0C和0x10 0x14

假设integer占用4个字节,则位置间隔4个字节。

如果这种情况下'array'表示数组的基址(指针),则为0x00。a的类型是int *。(因为数组元素的类型是整型)

如果你执行array+1,它将是0x04,因为指针的增量取决于指针的类型。如果指针是整型,则增加4个字节。如果整型是字符型,指针将增加一个字节。

所以如果你执行(array+5)它将指向地址0x14和

*(array+5)

返回位置0x14的值,即数组第5个位置的值。

所以在实际中,array[5]等于*(array+5)

编译器内部将array[5]转换为*(array+5)

所以即使我们写5[array],它也会被转换成*(5+array)

虽然看起来很奇怪,但这就是为什么5[array]和array[5]工作一样的原因