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

news2024/12/24 22:12:53

文章目录

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

应用场景

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

可能指向二维数组的指针

如果现在有一个二维数组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://www.coloradmin.cn/o/1018472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机械寿命预测(基于NASA C-MAPSS数据的剩余使用寿命RUL预测,Python代码,CNN_LSTM模型,有详细中文注释)

1.效果视频&#xff1a;机械寿命预测&#xff08;NASA涡轮风扇发动机剩余使用寿命RUL预测&#xff0c;Python代码&#xff0c;CNN_LSTM模型&#xff0c;有详细中文注释&#xff09;_哔哩哔哩_bilibili 环境库版本&#xff1a; 2.数据来源&#xff1a;https://www.nasa.gov/int…

指针和数组笔试题讲解(2)

&#x1f435;本篇文章将会对上篇一维数组笔试题的剩余部分和二维数组的笔试题进行讲解 一、一维数组 1>试题部分(一)✏️ char* p "abcdef";printf("%zd\n", sizeof(p)); printf("%zd\n", sizeof(p 1)); printf("%zd\n", sizeo…

Linux 创建目录

语法&#xff1a;mkdir xxx Linux路径 在当前目录下创建文件夹 在/目录下创建文件夹 如果想要一次性创建多个层级的目录&#xff0c;如下图 会报错&#xff0c;因为上级目录test并不存在&#xff0c;所以无法创建test目录 可以通过-p选项&#xff0c;将一整个链条都创建完成…

【OpenSSL】VC编译OpenSSL

VC编译OpenSSL 编译工具准备编译OpenSSL建立Hello World工程创建VS工程 编译工具准备 安装好Visual Studio。安装Perl, 主要是用来生成nmake的。准备好汇编语言编译工具nasm,并添加到path路径。下载好Open SSL源代码。 编译OpenSSL 安装Perl,并加入到path路径&#xff0c;检验…

【JAVA-Day18】用大白话讲解 Java 中的内存机制

标题 用大白话讲解 Java 中的内存机制摘要引言一、Java 内存机制1.1 栈内存1.2 堆内存 二、Java 如何管理内存三、合理管理内存的必要性与其他方式相比优势劣势建议四、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《…

idea创建springboot项+集成阿里连接池druid

创建项目并集成流程 1&#xff1a;前提准备2&#xff1a;创建springboot项目流程3&#xff1a;集成阿里连接池步骤4&#xff1a;集成swagger方便测试5&#xff1a;书写增删改查进行测试6&#xff1a;项目gitee地址 1&#xff1a;前提准备 准备开发工具&#xff1a;idea java环…

UI自动化测试实践

一、设计背景 随着IT行业的发展&#xff0c;产品愈渐复杂&#xff0c;web端业务及流程更加繁琐&#xff0c;目前UI测试仅是针对单一页面&#xff0c;操作量大。为了满足多页面功能及流程的需求及节省工时&#xff0c;设计了这款UI 自动化测试程序。旨在提供接口&#xff0c;集…

Blazor前后端框架Known-V1.2.15

V1.2.15 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

Linux下的系统编程——守护进程、线程(十二)

前言&#xff1a; 我们知道进程拥有一个PCB&#xff0c;在Linux中被称为task_struct,并且有一个进程地址空间&#xff0c;也有一个页表&#xff0c;通过页表指向物理内存&#xff0c;但是从今天开始&#xff0c;对进程的概念可能发生变化&#xff0c;这个我们后边来说&#xf…

【微信小程序】项目初始化

| var() CSS 函数可以插入一个自定义属性&#xff08;有时也被称为“CSS 变量”&#xff09;的值&#xff0c;用来代替非自定义 属性中值的任何部分。 1.初始化样式与颜色 view,text{box-sizing: border-box; } page{--themColor:#ad905c;--globalColor:#18191b;--focusColor…

通过Vcpkg直接安装Qt静态链接免编译的方式

Vcpkg支持自动编译Qt静态链接版&#xff0c;大约只需要30min左右&#xff0c;解决编译困扰和配置环境带来的各种影响。 一、查找Qt包 https://vcpkg.io/en/packages 输入qt5可找到qt5版本&#xff0c;如果需要安装最新的qt6&#xff0c;可直接输入qt&#xff0c;如下: 二、修…

操作系统存储器章节知识梳理

&#x1f525;&#x1f525;宏夏Coding网站&#xff0c;致力于为编程学习者、互联网求职者提供最需要的内容&#xff01;网站内容包括求职秘籍&#xff0c;葵花宝典&#xff08;学习笔记&#xff09;&#xff0c;资源推荐等内容。在线阅读&#xff1a;https://hongxiac.com&…

关于阻抗不连续的原因

1、连线中的分支结构 信号传输到分支结构处&#xff0c;表现出的是两条电路并联的效果&#xff0c;会导致阻抗的不连续问题。典型的就是菊花链结构。 2、参考平面的宽度 一般情况下参考平面都是很宽且连续的&#xff0c;但有的时候&#xff0c;参考平面会被反焊盘给掏空…

FPGA/数字IC(芯海科技2022)面试题 2(解析版)

以下仅为学习参考(非原创)&#xff0c;如有疑惑欢迎评论区指出&#xff01; 一、单选题&#xff08;共20题&#xff0c;每题3分&#xff0c;共60分&#xff09; 1. D触发器&#xff1a;Tsetup3ns&#xff0c;Thold1ns&#xff0c;Tck2q1ns&#xff0c; 该D触发器最大可运行时…

笔记1.5:计算机网络体系结构

从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体&#xff1a;表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合&#xff0c;协议是水平的。 任一层实体需要使用下层服务&#xff0c;遵循本层…

Linux 下的 10 个 PDF 软件

本文[1]是我们正在进行的有关 Linux 顶级工具系列的延续&#xff0c;在本系列中&#xff0c;我们将向您介绍最著名的 Linux 系统开源工具。 随着互联网上越来越多地使用可移植文档格式 (PDF) 文件来获取在线书籍和其他相关文档&#xff0c;拥有 PDF 查看器/阅读器对于桌面 Linu…

Wireshark分析HTTPS流量

1、设置环境变量 &#xff08;在不抓包的时候要把这个环境变量删掉,日志太多可能&#xff09; # 变量名称 SSLKEYLOGFILE # 变量值&#xff1a;日志文件存储的路径 D:\data\ssl\keylog.log2、 配置配置Wireshark软件文件路径 配置上之后一定要重启&#xff0c;不重启没效果。

Math_2023_09_17.java

package homework;import util.StringUtil;/*** 八位数: 2 _ _ _ _ _ _ 5* 每相邻三个数字和为11** author ZengWenFeng* email 117791303qq.com* mobile 13805029595* date 2023.09.17*/ public class Math_2023_09_17 { public static boolean isOk(String str, int sum){in…

Apache Hive概述,模拟实现Hive功能,Hive基础架构

1、Apache Hive 概述 1.1、分布式SQL计算 对数据进行统计分析&#xff0c;SQL是目前最为方便的编程工具。 大数据体系中充斥着非常多的统计分析场景 所以&#xff0c;使用SQL去处理数据&#xff0c;在大数据中也是有极大的需求的。 MapReduce支持程序开发&#xff08;Java…

88 # express 应用和路由的分离

上一节实现了应用和创建应用的分离&#xff0c;这一节来实现应用和路由的分离 application.js const http require("http"); const Router require("./router");function Application() {this._router new Router(); }Application.prototype.get fun…