如果从堆上分配内存并把地址赋给一个指针,那就肯定可以对指针使用数组下标并把这块内存当成一个数组。在下面的代码中,我们复制之前用过的数组vector
中的内容:
int *pv = (int*) malloc(5 * sizeof(int));
for(int i=0; i<5; i++) {
pv[i] = i+1;
}
也可以像下面这样使用指针表示法,不过数组表示法通常更简单:
for(int i=0; i<5; i++) {
*(pv+i) = i+1;
}
下图说明了本例的内存分配。
这种技术分配一块内存并把它当成数组,其长度在运行时确定。不过,我们得记得用完之后释放内存。
警告 在上个例子中我们用的是
*(pv+i)
而不是*pv+i
,因为解引操作符的优先级比加操作符高,先解引第二个表达式的指针,得到指针所引用的值,然后再给这个整数加上i
。这不是我们要的效果,而且,如果我们把这个表达式作为左值,编译器会抱怨。所以,为了让代码正确工作,我们需要强制先做加法,然后才是解引操作。