请解释带指针的数组
Please explain arrays with pointers
所以我是编程新手,我想了解教授制作的这个程序中指针的使用。
#include <iostream>
using namespace std;
typedef int* IntPtr;
int main()
{
IntPtr p;
int a[10];
int i;
for(i = 0; i<10; i++)
a[i] = i;
p = a;
for(i = 0; i<10; i++)
cout << p[i]<< " ";
cout << endl;
}
输出:0 1 2 3 4 5 6 7 8 9
根据我读到的内容,"p=a"将把数组的第一个元素的地址传递给"p"。所以我假设输出将全部为零。但当它打印时,它具有与数组"a"相同的元素。这就像它把a的所有元素的地址都传递给了p。有人能解释一下为什么吗。如果我不能很好地解释这个问题,我很抱歉,但我希望你明白我的意思。
通过a[i]
或p[i]
访问元素,其中a
是数组类型,p
是指针类型,称为下标运算符,您可以阅读其语义,例如内置的下标运算符:
。。。表达式E1[E2]与表达式*(E1+E2)完全相同
这意味着p[i]
与*(p + i)
相同,即它取消引用存储器地址(p+i)
处的值,而i
是使用sizeof(int)
正确计数的,因为p
是指向int
的指针。如果p
指向a
,这与a[i]
完全相同,后者也与*(a+i)
相同,其中a
衰减到指向数组a
中第一个元素的指针。
希望能有所帮助。
我希望你的教授教授教授指针的含义、内存布局、去引用等等。IMHO,对指针和指针算术充满信心是几个月(实际上是几年)的问题,而不是一堂"课"的问题。
很遗憾,学生们再也没有解释内存管理是如何工作的。。。
如果你分配了一些东西,它在物理上最终会成为一块连续的内存。也就是说:如果分配一个数组,它是一个连续内存块中的字节序列。
指针只不过是一小块内存(通常为4或8字节),其中包含其他东西的地址。例如,它指向数据。
本例中的数组是一个字节序列,因为int有4个字节,所以它是40个字节。取消引用数组中的元素意味着读取索引X处的整数(换句话说:读取从X*4到但不包括(X+1)*4的4个字节——或者更准确地说:[X*4, (X+1)*4>
)。
使用指针意味着读取地址所指向的内容。在这种情况下,指针包含数组第一个元素的地址,因此读取*p
意味着读取数组的前4个字节。它是p[0]
的同义词。
这基本上是有效的,因为数组中的数据是连续存储的,并且没有数据被复制。因此,如果您编写a[2] = 2
,它只需覆盖名为数组的内存块中的字节2*4到(2+1)*4(更准确地说:[2*4, (2+1)*4>
)。它不会复制、更改p
中的地址或其他任何内容。
PS:需要注意的一个重要细节是,在C++中,整数数组之类的东西的分配并不意味着将所有值都设置为0。它只是分配一块具有正确类型的内存;仅此而已。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”