首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是数组指针int (*ptr)[10],它是如何工作的?

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

Stack Overflow用户
提问于 2020-09-26 19:01:17
回答 4查看 1.7K关注 0票数 7
代码语言:javascript
复制
int (*ptr)[10];

我原以为ptr10整数的指针数组。

我不明白它是一个指向10整数数组的指针。

EN

回答 4

Stack Overflow用户

发布于 2020-09-26 19:04:40

ptr的类型是“指向10int数组的指针”。在您的声明中,它是未初始化的,因此它不指向任何对象。要使其指向数组,请执行以下操作:

代码语言:javascript
复制
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

// initialize in the declaration:
int (*ptr) [10] = &arr;

// or after:
int (*ptr) [10];
ptr = &arr;
票数 4
EN

Stack Overflow用户

发布于 2020-09-26 19:04:20

指向10个int的数组的指针是指向10个元素的数组,如果是2D数组,则指向该数组的给定行,前提是该数组恰好有10列。

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

示例1:

代码语言:javascript
复制
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

这样的指针可用于指向具有未确定行数但固定列数的2D阵列。

示例2:

代码语言:javascript
复制
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

示例3:

代码语言:javascript
复制
int(*ptr)[3];

int arr[2][3] = {{1, 2, 3}, {4, 5, 7}};
ptr = arr;

printf("%d", ptr[1][2]); //array indexing is identical as using arr[1][2] 

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

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

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

代码语言:javascript
复制
int (*ptr)[5]; 
ptr = calloc(5, sizeof *ptr); //simple assignment

free(ptr); //simple deallocation
代码语言:javascript
复制
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]);

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

代码语言:javascript
复制
int *ptr[5];

for (int i = 0; i < 5; i++)
    ptr[i] = calloc( i + 1, sizeof **ptr);

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

票数 3
EN

Stack Overflow用户

发布于 2020-09-26 19:13:16

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

代码语言:javascript
复制
int (*ptr) [10];
     ^ a pointer
           ^ to an array of 10
^ ints

vs

代码语言:javascript
复制
int* ptr[10];
        ^ array of 10
   ^ pointer to int
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64076876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档