有人能澄清这个数组/指针的想法给我
Can someone clarify this array/pointer idea to me?
为了解释数组只是指向我们类的指针(在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]工作一样的原因
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空