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

这篇具有很好参考价值的文章主要介绍了C语言指向二维数组的四种指针以及动态分配二维数组的五种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

应用场景

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

可能指向二维数组的指针

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

指针指向二维数组的几种方法,C,c语言,算法,开发语言,二维数组,内存管理

  • 方式四:使用此方式时有一些限制,因为以此方式分配的二维数组在内存上不连续
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;
}

指针指向二维数组的几种方法,C,c语言,算法,开发语言,二维数组,内存管理

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

指针指向二维数组的几种方法,C,c语言,算法,开发语言,二维数组,内存管理文章来源地址https://www.toymoban.com/news/detail-757850.html

到了这里,关于C语言指向二维数组的四种指针以及动态分配二维数组的五种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java创建数组的四种方式

    1.使用默认值来初始化 语法: 数组元素类型 [] 数组名称 = new 数组元素类型 [数组长度] EG: int [] nums = new int [5]; //创建了一个类型为int,名字为nums ,长度为5的数组 2.先声明一个数组,再给值 语法: 数据元素类型 [] 数组名称; 数组名称 = new 数组元素类型[数组长度]; EG: int [] nums; num

    2024年02月09日
    浏览(59)
  • C语言指针操作(六)指向函数的指针

    指向函数的指针详解,以及如何使用指向函数的指针变量做函数参数 指向函数的指针作为函数参数,是 C 语言实际应用中的一个比较深入的部分。 目录 一、什么是函数的指针 二、用函数指着变量调用函数 2.1举例说明 三、怎样定义和使用指向函数的指针变量 3.1定义指向函数

    2024年02月05日
    浏览(51)
  • 【C/C++】统计数组各元素个数的四种方法

     问题:给定一个数组,输出各元素出现的次数。 目录 法一:逐个统计 法二:用数组以值代址 法三:先排序,再进行统计 法四:利用哈希表进行统计  思路: 数组第一个数为目标,遍历数组进行统计,统计后的数据替换成0(表示已删除),统计后输出数目。 优点:呃。。

    2024年01月21日
    浏览(36)
  • Java创建数组、赋值的四种方式,声明+创建+初始化 详解

    以int数据类型为例 注意: new 数据类型[]{},其中花括号可以省去,但要在[ ]中填写数组的个数; 创建多维数组时 new后面第一个方括号中的元素数量不能省略 1、一维数组的声明方式: type[] arrayName; 或 type arrayName[]; 推荐使用第一种格式,因为第一种格式具有更好的可读性,表

    2024年04月11日
    浏览(55)
  • 8.5 【C语言】指向函数的指针

    每次调用函数时都从该地址入口开始执行此段函数代码。函数名代表函数的起始地址。 例8.22 用函数求整数a和b中的大者 解题思路:在主函数调用max函数,除了可以通过函数名调用外,还可以通过指向函数的指针变量来实现。 (2)通过指针变量调用它所指向的函数 类型名(

    2024年02月11日
    浏览(30)
  • C++笔记之基类指针动态地指向某一个子类情况列举

    code review!

    2024年02月12日
    浏览(48)
  • 【数据结构】-快速排序的四种方法实现以及优化

    作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 今天讲一种不一样的排序,听名字就知道这个排序不拐弯抹角的,我们来看看它又多快速,并且快速排序的前三种方法都是递归思想,

    2024年02月03日
    浏览(46)
  • (c语言)素数判断的四种方法

    2024年02月04日
    浏览(45)
  • C语言-二维数组-求5*5矩阵的两条对角线之和,以及四周边界元素之和

    一.我的思路 (1)首先要用二维数组把数先存进去,再一想怎么存呢?我已经学了两种方法:第一就是进行数组初始化(比较单一),第二就是运用循环语句输入(也就是给数组赋值,求不同的数组很方便),我做的是题目中给了数组,我就采用了第一种。 (2)其次存完之后,就要想办

    2024年02月04日
    浏览(61)
  • 反转链表的四种方法(C语言)

    206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head = [1,2] 输出:[2,1] 示例 3: 输入:head = [] 输出:[] 提示: 链表中节点的数目范围是 [0, 5000] -5000 = Node.val = 5000 本题链表不带头结点

    2024年03月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包