rah*_*a v 7 c c++ arrays pointers pointer-to-array
int (*ptr)[10];
Run Code Online (Sandbox Code Playgroud)
我期望ptr是一个10整数指针数组。
我不明白它是如何指向10整数数组的。
我喜欢这样读:(已经发布了很好的答案)
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)
指向 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 的空间,依此类推。