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;
}

在这里插入图片描述

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

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

相关文章

OpenGLES:单纹理贴图

一.概述 最近疏于写博客&#xff0c;接下来会陆续更新这段时间OpenGLES的一些开发过程。 前两篇OpenGLES的博客讲解了怎样使用OpenGLES实现相机普通预览和多宫格滤镜 在相机实现过程中&#xff0c;虽然使用到了纹理&#xff0c;但只是在生成一个纹理之后&#xff0c;使用纹理…

vuepress+gitee免费搭建个人在线博客(无保留版)

文章目录 最终效果&#xff0c;一睹为快&#xff01;一、工具选型二、什么是VuePress三、准备工作3.1 node 安装3.2 Git安装3.3 Gitee账号注册 四、搭建步骤4.1 初始化VuePress4.2 安装VuePress4.3 初始化目录4.4 编写文章 五、部署到Gitee5.1 创建仓库5.2 个人空间地址设置4.3…

【JVM内存区域及创建对象的过程】

文章目录 JVM内存区域及创建对象的过程JVM内存区域JDK1.6、1.7、1.8内存区域的变化&#xff1f;创建对象的过程类的声明周期&#xff1a; JVM内存区域及创建对象的过程 JVM内存区域 JVM 内存区域最粗略的划分可以分为 堆 和栈&#xff0c;当然&#xff0c;按照虚拟机规范&…

2023华为杯数学建模竞赛E题

一、前言 颅内出血&#xff08;ICH&#xff09;是由多种原因引起的颅腔内出血性疾病&#xff0c;既包括自发性出血&#xff0c;又包括创伤导致的继发性出血&#xff0c;诊断与治疗涉及神经外科、神经内科、重症医学科、康复科等多个学科&#xff0c;是临床医师面临的重要挑战。…

Linux 操作技巧

目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳&#xff0c;命令解释器&#xff0c;负责解析用户输入的命令 ——内置命令&#xff08;shell内置&#xff09; ——外置命令&#xff0c;在文件系统的某个目录下&…

如何取消显示Notepad++每行显示的CRLF符号

新电脑中重新安装了Nodepad&#xff0c;打开记事本后发现出现了许多黑底的CR|LF标记&#xff0c;特别碍眼。 如何取消呢&#xff1f; 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果

SpringBoot结合Vue.js+axios框架实现增删改查功能+网页端实时显示数据库数据(包括删除多条数据)

本文适用对象&#xff1a;已有基础的同学&#xff0c;知道基础的SpringBoot配置和Vue操作。 在此基础上本文实现基于SpringBoot和Vue.js基础上的增删改查和数据回显、刷新等。 一、实时显示数据库数据 实现步骤&#xff1a; 第1步&#xff1a;编写动态请求响应类&#xff1a…

Ubuntu上线一个JAVA环境微服务架构的系统

项目介绍 项目背景: 已经有一套系统,迁移部署到新服务器,并使用不同数据,相同框架,提供对应业务服务 单机测试,从裸机-系统安装-软件架构-部署-数据迁移-发版-上线,整体流程与思路分享,包含后端、数据,测试、网络、运维等相关事务。 项目目的: 部署并迁移系统,…

linux下CentOS安装mysql-5.7

linux下安装mysql只需要在root用户下安装&#xff0c;普通用户也能使用 1.检查&#xff1a; 通过以下两条命令查看改系统下是否已存在mysql。 ps ajx | grep mysql ps ajx | grep mariadb通过指令如果只显示如下两条信息&#xff0c;则当前系统下不存在MySQL。 就可以直接进…

【初阶数据结构】二叉树全面知识总结

二叉树详解 树的概念及其结构树的概念树的相关概念树的表示方法孩纸兄弟表示法双亲表示法&#xff08;并查集&#xff09; 树的实际应用 二叉树二叉树的概念二叉树的种类二叉树的性质二叉树的存储结构 二叉树顺序结构的实现堆的概念及结构堆向上、向下调整法堆的插入堆的删除堆…

华为云云耀云服务器L实例评测 | 使用Docker快速搭建博客系统

使用Docker快速搭建wordpress博客系统. 文章目录 使用Docker快速搭建wordpress博客系统.需要了解部署与管理工具介绍安装Docker配置镜像加速器下载镜像创建数据库容器创建wordpress博客容器访问博客初始化配置博客扩展和管理 WordPress总结 需要了解 本文主要讲述快速搭建自己的…

Apache Doris 快速入门

1. 基本概念 FE&#xff0c;Frontend&#xff0c;前端节点&#xff0c;接收用户查询请求&#xff0c;SQL解析&#xff0c;执行计划生成&#xff0c;元数据管理&#xff0c;节点管理等 BE&#xff0c;Backend&#xff0c;后端节点&#xff0c;数据存储&#xff0c;执行查询计划…

[npm]脚手架本地全局安装1

[npm]脚手架本地全局安装1 npm link 全局安装npm install 全局安装卸载全局安装的脚手架 该文章是你的脚手架已经开发完成的前提下&#xff0c;你想要本地全局安装该脚手架&#xff0c;便于本地使用脚手架的命令的情况 npm link 全局安装 如果本地开发的项目是个脚手架&#…

Redis学习笔记--002

Redis的JAVA客户端 文章目录 Redis的JAVA客户端一、Redis的Java客户端的种类二、Jedis2.1、使用步骤2.2、Jedis连接池 三、[SpringDataRedis](https://spring.io/projects/spring-data-redis)3.1、介绍3.2、RedisTemplate3.3、SpringDataRedis使用步骤3.4、SpringDataRedis的序…

10.1网站编写(Tomcat和servlet基础)

一.Tomcat: 1.Tomcat是java写的,运行时需要依赖jre,所以要装jdk. 2.建议配置好环境变量. 3.默认端口号8080(业务端口)可能会被占用,建议改一下(本人改成了9999). 4.另一个默认端口是8005(管理端口). 二Servlet基础(编写一个hello world代码): 整体分为7个步骤,分别是创建…

linux安装mysql8.0

最近在云服务器上部署服务&#xff0c;需要在linux端安装mysql8以上的版本&#xff0c;出现一些问题&#xff0c;记录一下。 1.首先卸载以前mysql版本。 &#xff08;1&#xff09;停止mysql服务。 systemctl stop mysqld.service (2)删除对应程序与文件。 查看安装…

什么是机器学习?

所谓的机器学习就是让机器去学习&#xff0c; 在这里关键词是学习两个字 在我们传统的学习算法的过程中&#xff0c; 我们真正要做的事情其实是让机器去执行&#xff0c;也就是说设计一个算法&#xff0c; 去让机器具体的完成一个任务&#xff0c;而不是学习一个任务 最早的机器…

JumpServer开源堡垒机与爱可生云树数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经完成与爱可生云树数据库软件的兼容性认证。经过双方联合测试&#xff0c;云树数据库软件&#xff08;简称&#xff1a;ActionDB&#xff09;V1.0与杭州飞致云信息科技有限公司…

雷达编程实战之静态杂波滤除与到达角估计

雷达中经过混频的中频信号常常混有直流分量等一系列硬件设计引入的固定频率杂波&#xff0c;我们称之位静态杂波&#xff0c;雷达信号处理需要把这些静态杂波滤除从而有效的提高信噪比&#xff0c;实现准确的目标检测功能。 目标的到达角估计作为常规车载雷达信号处理的末端&am…

针对敏感数据的安全转录服务

即便在新冠肺炎疫情期间&#xff0c;继续保持了最高级别的机密性 新冠肺炎疫情带来的各种限制向所有服务提供商提出了挑战&#xff0c;促使提供商们想方设法采取更富想象力的新方法来满足客户的需求。澳鹏采用了一种由两种方案组成的工作机制&#xff0c;服务于客户机密材料的…