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.rhkb.cn/news/140563.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决模型半透明时看到内部结构的问题

大家好&#xff0c;我是阿赵。   之前在做钢铁侠线框效果的时候&#xff0c;说到过一种技术&#xff0c;这里单独拿出来再说明一下。   我们经常要做一些模型半透明效果&#xff0c;比如这个钢铁侠的模型&#xff0c;我做了一个Rim边缘光的效果&#xff0c;边缘的地方亮一点…

小白学Python:提取Word中的所有图片,只需要1行代码

#python# 大家好&#xff0c;这里是程序员晚枫&#xff0c;全网同名。 最近在小破站账号&#xff1a;Python自动化办公社区更新一套课程&#xff1a;给小白的《50讲Python自动化办公》 在课程群里&#xff0c;看到学员自己开发了一个功能&#xff1a;从word里提取图片。这个…

20230919后台面经整理

1.你认为什么是操作系统&#xff0c;操作系统有哪些功能 os是&#xff1a;管理资源、向用户提供服务、硬件机器的扩展 1.进程线程管理&#xff1a;状态、控制、通信等 2.存储管理&#xff1a;分配回收、地址转换 3.文件管理&#xff1a;目录、操作、磁盘、存取 4.设备管理&…

neo4j下载安装配置步骤

目录 一、介绍 简介 Neo4j和JDK版本对应 二、下载 官网下载 直接获取 三、解压缩安装 四、配置环境变量 五、启动测试 一、介绍 简介 Neo4j是一款高性能的图数据库&#xff0c;专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构&#xff0c;非常适用于…

SSRF漏洞

Server-Side Request Forgery:服务器端请求伪造 目标&#xff1a;网站的内部系统 形成的原因 攻击者构造形成由服务器端发起请求的译者安全漏洞。 由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内…

数量关系(刘文超)

解题技巧 代入排除法 数字特性法 整除特性 比例倍数特性&#xff08;找比例&#xff0c;比例不明显时找等式&#xff09; 看不懂式子时&#xff0c;把所有的信息像表格一样列出来 看不懂式子时&#xff0c;把所有的信息像表格一样列出来

10.2servlet基础2

一.SmartTomcat 1.第一次使用需要进行配置. 二.异常处理 1.404:浏览器访问的资源,在服务器上不存在. a.检查请求的路径和服务器配置的是否一致(大小写,空格,标点符号). b. 确认webapp是否被正确加载(检查web.xml没有/目录错误/内容错误/名字拼写错误)(多多关注日志信息). 2…

kali linux多版本java共存并自由切换 update-alternatives

Kali Linux通过apt和dpkg安装的Java不是一样的。 它们安装的Java版本和管理方式可能不同。 1. **apt 安装 Java&#xff1a;** 当您使用apt包管理器在Kali Linux上安装Java时&#xff0c;您实际上是安装了由Kali Linux官方仓库提供的Java版本。 这个版本通常是经过Kali Linux团…

vue指令(代码部分三)

<template><view><view click"onClick">标题&#xff1a;{{title}}</view><input type"text" v-model"title"/>----------------案例----------------<view class"out"><view class"row&…

【李沐深度学习笔记】自动求导

课程地址和说明 自动求导p1 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 吸取上一次写文章的经验&#xff0c;这次公式部分尽量采用直接截图&#xff0c;不用lateX&#xff0c;用lateX有一些浪费时间 自动求导…

day4_QT

day4_QT qt绘制钟表 qt绘制钟表 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(1000,1000);this->setStyleSheet("background-color:…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数&#xff0c;不是关键字。 变量初始化&#xff0c;一般分为2步&#xff0c;变量声明变量内存分配&#xff0c;var 关键字就是用来声明变量的&#xff0c;new和make 函数主要是用来分配内存的。 var 声明值类型的变量时&#xff0c;系统会默…

基于微信小程序的流浪动物救助系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

python+selenium进行cnblog的自动化登录测试

Web登录测试是很常见的测试&#xff0c;手动测试大家再熟悉不过了&#xff0c;那如何进行自动化登录测试呢&#xff01;本文就基于pythonselenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化登录测试&#xff0c;可提供点参考&#xff01;下面就包括测试代…

SpringBoot统一返回处理遇到cannot be cast to java.lang.String问题

ResponseBodyAdvice 接口概述 1、ResponseBodyAdvice 接口允许在执行 ResponseBody 或 ResponseEntity 控制器方法之后&#xff0c;但在使用 HttpMessageConverter 写入响应体之前自定义响应&#xff0c;进行功能增强。通常用于 加密&#xff0c;签名&#xff0c;统一数据格式…

计算机组成原理课程设计

操作控制和顺序控制 操作控制就是由各种微命令来构成的顺序控制就是由P测试和后续微地址构成的 这就构成了整个微指令的三个部分 访存指令就是实现对主存中的数据进行访问或存储 一、 操作控制字段是由各种微命令来构成的&#xff0c;这些微命令怎么来设计&#xff1f; 一个萝卜…

如何在Gazebo中实现多机器人编队仿真

文章目录 前言一、仿真前的配置二、实现步骤1.检查PC和台式机是否通讯成功2.编队中对单个机器人进行独立的控制3、对机器人进行编队控制 前言 实现在gazebo仿真环境中添加多个机器人后&#xff0c;接下来进行编队控制&#xff0c;对具体的实现过程进行记录。 一、仿真前的配置…

信息安全性测试的流程

安全测试 一、信息安全性测试的定义 软件安全是一个广泛而复杂的主题&#xff0c;每一个新软件都可能存在安全的缺陷&#xff0c;甚至这个缺陷是前所未见的。信息安全性测试的目的在于通过系统的测试&#xff0c;对所测软件提出安全改进建议&#xff0c;帮助用户将风险控制/转…

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行&#xff1a; npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript&#xff0c;Vue和React是常用前端框架&#xff0c;可以根据自己的需要进行选择 通过上下键进行选择&#xff0c;按下回车进行确认 创建…

mysql四种事务隔离级别介绍

MySQL事务隔离级别定义了不同事务之间的隔离程度。MySQL标准列表了四个隔离级别&#xff0c;依次为读未提交&#xff08;READ UNCOMMITTED&#xff09;、读已提交&#xff08;READ COMMITTED&#xff09;、可重复读&#xff08;REPEATABLE READ&#xff09;和串行化&#xff08…