所以我是编程的新手,我想了解我的教授在这个程序中使用指针。
#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的所有元素的地址。有人可以解释原因。对不起,如果我不能很好地解释这个问题,但我希望你明白我的意思。
答案 0 :(得分:1)
实际上很遗憾,学生们不再解释记忆管理是如何运作的......
如果你分配一些东西,它实际上最终会成为一块连续的记忆。也就是说:如果你分配一个数组,它就是一个连续内存块中的字节序列。
指针只是一小段内存(通常是4或8个字节),包含其他内容的地址。例如。它指向数据。
这种情况下的数组是一个字节序列,因为int有4个字节,所以它是40个字节。取消引用数组中的元素意味着读取索引X处的整数。(换句话说:从X * 4读取4个字节,但不包括(X + 1)* 4 - 或更精确:[X*4, (X+1)*4>
) 。
使用指针意味着读取地址指向的内容。在这种情况下,指针包含数组的第一个元素的地址,因此读取*p
意味着读取数组的前4个字节。它是p[0]
的同义词。
这基本上有效,因为数组中的数据是连续存储的,因为没有数据被复制。因此,如果您编写a[2] = 2
,它只会将名为您的数组的内存块中的字节2 * 4覆盖为(2 + 1)* 4(更精确:[2*4, (2+1)*4>
)。它不会复制,更改p
中的地址或其他任何内容。
答案 1 :(得分:1)
通过a[i]
或p[i]
访问元素,其中a
是一个数组类型,而p
是一个指针类型,称为下标运算符,你可以阅读它的内容语义,例如,built in subscript operator:
... 表达E1 [E2]与表达式*(E1 + E2)
完全相同
这意味着p[i]
与*(p + i)
相同,即它取消引用内存地址(p+i)
的值,而使用i
正确计算sizeof(int)
因为p
是指向int
的指针。如果p
指向a
,则与a[i]
完全相同,后者与*(a+i)
完全相同,其中a
衰减为指向数组a
中的第一个元素。
希望它有所帮助。
我希望你的教授讲授指针,内存布局,解除引用等等的含义。恕我直言,对指针和指针算术有信心是几个月(实际上是几年),而不是一个教训&#34;。