应用场景
当二维数组作为结构成员或返回值时,通常需要根据用户传递的参数来决定二维数组的大小,此时就需要动态分配二维数组。
可能指向二维数组的指针
如果现在有一个二维数组a[3][2]
,那么将有以下几种指针可以指向它:
//第一种:二维数组指针,指向整个二维数组
int (*ptr)[3][2]=&a;
//第二种:一维数组指针,指向二维数组第一行元素
int (*ptr)[2]=a;//or &a[0]
//第三种:int *型指针,指向二维数组第一行第一列的第一个元素
int *ptr=&a[0][0];//or *a
//第四种:int *型指针,指向二维数组第一行元素
int **ptr = calloc(3, sizeof(int *));
for (int i = 0; i < 3; ++i) {
*(ptr+i)=*(a+i);
}
动态分配二维数组
- 方式一
int main(int argc, char **argv) {
//初始化
int (*ptr)[3][2] = calloc(3 * 2, sizeof(int));
//赋值
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
(*ptr)[i][j]=j;
}
}
//打印
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
printf("%d", (*ptr)[i][j]);
}
printf("\n");
}
return 0;
}
- 方式二:
int main(int argc, char **argv) {
//初始化
int (*ptr)[2] = calloc(3 * 2, sizeof(int));
//赋值
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
*(ptr[i]+j)= j;
}
}
//打印
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
printf("%d", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
在应用场景中通常采用以下三种方式动态分配二维数组,因为这两种方式在声明二维数组时不需要知道二维数组的大小:
- 方式三
int main(int argc, char **argv) {
//初始化
int *a = calloc(2 * 3, sizeof(int));
//赋值
for (int i=0;i<3;i++){
for (int j = 0; j < 2; ++j) {
*(a+2*(i-1)+j)=j;
}
}
//打印
for (int i=0;i<3;i++){
for (int j = 0; j < 2; ++j) {
printf("%d",*(a+2*(i-1)+j));
}
printf("\n");
}
return 0;
}
- 方式四:使用此方式时有一些限制,因为以此方式分配的二维数组在内存上不连续
int main(int argc, char **argv) {
//初始化
int **ptr = calloc(3, sizeof(int *));
for (int i = 0; i < 3; ++i) {
*(ptr+i)=calloc(2, sizeof(int));
}
//赋值
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
*(*(ptr+i)+j)=j;
}
}
//打印
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
printf("%d",*(*(ptr+i)+j));
}
printf("\n");
}
return 0;
}
文章来源:https://www.toymoban.com/news/detail-757850.html
- 方式五:第四种方式的改进,内存连续
int main(int argc, char **argv) {
//初始化
int **ptr = calloc(3, sizeof(int *));
*ptr = calloc(3 * 2, sizeof(int));
for (int i = 1; i < 3; ++i) {
*(ptr + i) = *ptr + i * 2;
}
//赋值
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
*(*(ptr + i) + j) = j;
}
}
//打印
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 2; ++j) {
printf("%d", *(*(ptr + i) + j));
}
printf("\n");
}
return 0;
}
文章来源地址https://www.toymoban.com/news/detail-757850.html
到了这里,关于C语言指向二维数组的四种指针以及动态分配二维数组的五种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!