什么是数组指针,int (*ptr)[10],它是如何工作的?

rah*_*a v 7 c c++ arrays pointers pointer-to-array

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

我期望ptr是一个10整数指针数组。

我不明白它是如何指向10整数数组的。

And*_* DM 5

我喜欢这样读:(已经发布了很好的答案)

int (*ptr) [10];
     ^ a pointer
           ^ to an array of 10
^ ints
Run Code Online (Sandbox Code Playgroud)

int* ptr[10];
        ^ array of 10
   ^ pointer to int
Run Code Online (Sandbox Code Playgroud)


ana*_*ciu 3

指向 10 秒数组的指针int意味着指向 10 个元素的数组,不能多也不能少,或者如果您有一个 2D 数组,则指向该数组的给定行,前提是它恰好有 10 列。

int指向, ,的指针数组int *ptr[10]就是这样,它有 10 个指针int,每个指针都可以分配一个 的地址int,它可以是数组的一部分,也可以不是。

示例1:

int (*ptr)[10];

int arr[10];
ptr = &arr; //correct, arr has 10 elements

int arr2[12]; 
ptr = &arr2; //not correct, arr2 does not have 10 elements
Run Code Online (Sandbox Code Playgroud)

此类指针可用于指向行数不确定但列数固定的二维数组。

示例2:

int (*ptr)[10];

int arr[10];
ptr = &arr; //correct, arr has 10 elements

int arr2[12]; 
ptr = &arr2; //not correct, arr2 does not have 10 elements
Run Code Online (Sandbox Code Playgroud)

示例3:

int arr[5][10];
ptr = arr; //correct, pointer to the 1st row of a 2D array with 10 cols
ptr++; //now points to the second row        
    
int arr2[5][12]; 
ptr = arr2; //not correct, incompatible pointer, has too many cols
Run Code Online (Sandbox Code Playgroud)

指针数组与指向数组的指针

当需要动态分配/释放内存时,指向数组的指针的优点就显现出来了:

具有 4 行 5 列的 2D 数组示例:

int (*ptr)[5]; 
ptr = calloc(5, sizeof *ptr); //simple assignment

free(ptr); //simple deallocation
Run Code Online (Sandbox Code Playgroud)
int *ptr[5];

for (int i = 0; i < 5; i++)  //each pointer needs it's own allocation
    ptr[i] = calloc(5, sizeof **ptr);

for (int i = 0; i < 5; i++)  //each pointer needs to be freed
    free(ptr[i]);
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你有一个指针数组,你可以有一个不均匀的数组,也就是说,第一行可以有 10int个,但第二行可以有 20 个:

int *ptr[5];

for (int i = 0; i < 5; i++)
    ptr[i] = calloc( i + 1, sizeof **ptr);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,二维数组的第一行有 1 的空间int,第二行有 2 的空间,第三行有 3 的空间,依此类推。