有什么不同?指向数组与常规数组的指针

Jam*_*s T 9 c c++

我熟悉Java并试图自学C/C++.我偷了从承载它们的材料类课程的一些在这里.不幸的是,我不能问老师,因为我不在课堂上.我关注的是"动态声明的数组"下的部分:

如果希望能够在运行时更改数组的大小,则声明动态数组.这些都是通过指针和new运算符完成的.有关指针的基础知识,请阅读指针部分.

使用new分配内存,然后以与静态数组相同的方式访问数组.例如,

int*arrayPtr = new int [10]; for(int i = 0; i <10; i ++){arrayPtr [i] = i; }

内存画面与静态数组相同,但如果需要,可以更改大小.不要忘记在分配新内存之前必须释放内存(否则会导致内存泄漏).

delete [] arrayPtr; //删除数组指针时需要[] arrayPtr = new int [50]; ...

完成数组后,必须删除其内存:

delete [] arrayPtr;

动态多维数组以与Java类似的方式完成.你将有指针指针.例如,请参阅a

我的理解是C中的数组只是对数组中第一个元素的内存地址的引用.

那么,是什么样的区别int *pointerArray = new int[10];int array[10];如果有的话?

我做了一些测试,似乎表明他们完全一样.网站是错的还是我读错了?

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char** argv) {

    // Initialize the pointer array
    int *pointerArray = new int[10];
    for (int i = 0; i < 10; i++){

        pointerArray[i] = i;
    }

    // Initialize the regular array
    int array[10];
    for (int i = 0; i < 10; i++){

        array[i]= i;
    }

    cout << *(pointerArray + 5) << endl;
    cout << *(array + 5) << endl;

    cout << pointerArray[5] << endl;
    cout << array[5] << endl;

    cout << pointerArray << endl;
    cout << array << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

5
5
5
5
0x8f94030
0xbfa6a37c
Run Code Online (Sandbox Code Playgroud)

我试图按照网站上的描述"动态地重新调整"我的指针数组的大小,但我的新(更大)指针数组最终填充0,这不是很有用.

evg*_*eny 16

int array[10];静态地声明数组大小,这意味着它是固定的 - 这是唯一的主要区别.它也可能被分配在函数的堆栈框架内,即在程序的堆栈中.你不必担心delete []在那种阵列上使用,事实上,你可能会崩溃程序delete.

当你使用时operator new,你动态地分配内存,这可能会更慢,内存通常来自而不是程序的堆栈(虽然并不总是如此).在大多数情况下这是更好的,因为堆栈空间比堆空间更受限制.但是,delete[]当您不再需要时,必须注意内存泄漏和内容.

至于你的数组被零填充,你的课程材料没有说的是你必须这样做:

int *arr = new int[20]; // old array
//do magic here and decide that we need a bigger array
int *bigger = new int[50]; // allocate a bigger array
for (int i = 0; i < 20; i++) bigger[i] = arr[i]; // copy the elements from the old array into the new array
delete[] arr;
arr = bigger;
Run Code Online (Sandbox Code Playgroud)

该代码将数组扩展了arr30多个元素.请注意,您必须将旧数据复制到新数组中,否则它将不存在(在您的情况下,所有内容都变为0).


ser*_*gio 7

我的理解是C中的数组只是对数组中第一个元素的内存地址的引用.

那么,int*pointerArray = new int [10]之间的区别是什么?和int数组[10]; 如果有的话?

你提到的是在任何C/C++初学者中引起很多混淆的原因.

在C/C++中,数组对应的存储块足够大以容纳其所有元素.这与[]语法相关联,如示例所示:

int array[10];
Run Code Online (Sandbox Code Playgroud)

C/C++的一个特性是你可以通过使用指向其类型的指针来引用数组.因此,您可以写:

int* array_pointer = array;
Run Code Online (Sandbox Code Playgroud)

这与:

int* array_pointer = &array[0];
Run Code Online (Sandbox Code Playgroud)

并且这允许以通常的方式访问数组元素:array_pointer[3]但是你不能把它array当作指针,比如在它上面做指针算术(即数组++失败).

也就是说,你可以[]在不使用语法的情况下管理数组,只需通过使用malloc然后将它们与原始指针一起使用来分配数组.这就是C/C++的"美".

恢复:必须区分指针和它指向的内存(实际数组):

  1. []声明中的语法(即int array[10];)同时引用两个方面(它给出了一个指针和一个数组);

  2. 当声明一个指针变量(即int* p;)时,你只需得到指针;

  3. 在评估表达式(即,, int i = p[4];array[4];)时,[]只是意味着解除引用指针.

除此之外,int *pointerArray = new int[10];和之间的唯一区别int array[10];是前者是动态分配的,后者是堆栈.