当前位置:首页 » 《随便一记》 » 正文

C语言指向二维数组的四种指针以及动态分配二维数组的五种方式

4 人参与  2024年03月10日 09:41  分类 : 《随便一记》  评论

点击全文阅读


文章目录

应用场景可能指向二维数组的指针动态分配二维数组

应用场景

当二维数组作为结构成员或返回值时,通常需要根据用户传递的参数来决定二维数组的大小,此时就需要动态分配二维数组。

可能指向二维数组的指针

如果现在有一个二维数组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;}

在这里插入图片描述

方式五:第四种方式的改进,内存连续
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;}

在这里插入图片描述


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/76888.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 婚礼当天,他却带走了妹妹读者推荐_婷婷泽宇妹妹最新目录_小说后续在线阅读_无删减免费完结_
  • 背叛我的未婚妻,最后却一无所有(许慕嫣韩少言),背叛我的未婚妻,最后却一无所有
  • 墨澜翩婉慕亦辰(先婚后爱:霸道慕少无限宠):结局+番外评价五颗星
  • 夫人死后,京圈大佬火葬场哭红眼小说(厉惊寒白簌)小说***下载_章节前文+后续(夫人死后,京圈大佬火葬场哭红眼)
  • 全书浏览我爸将我扔在鬼屋后,他疯了(周念朵朵)_我爸将我扔在鬼屋后,他疯了(周念朵朵)全书结局
  • 火车出发时,未婚夫为了等白月光不让我们上车畅读(梁云陆野梁秀兰)全书免费_(梁云陆野梁秀兰)火车出发时,未婚夫为了等白月光不让我们上车畅读后续(梁云陆野梁秀兰)
  • 逢时未凌青云精心打造(谢云月宋轩明)_逢时未凌青云精心打造谢云月宋轩明
  • 全书浏览竹马太子爷让百名保镖教我学规矩,我为绝症小叔冲喜后他跪地追妻(霍沉穆奚妙妙江聿风)_竹马太子爷让百名保镖教我学规矩,我为绝症小叔冲喜后他跪地追妻(霍沉穆奚妙妙江聿风)全书结局
  • 宋眠夏霍司年是什么小说(七年情深深几许)(宋眠夏霍司年)全本完整清爽版在线+无广告结局
  • 彼岸花开不见君爽文(唐知夏沈君宴)
  • 火车出发时,未婚夫为了等白月光不让我们上车+番外+后续(梁云陆野梁秀兰),火车出发时,未婚夫为了等白月光不让我们上车+番外+后续
  • 总裁妻子抽签把我的618业绩换给男实习生隐藏剧情_玲玲小白脸何嘉木大反击_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1