通过 指针 引用 多维数组 详解

news2024/11/29 0:30:11

 

目录

一:回顾多维数组地址知识

二:二维数组的有关指针

三:指向数组元素的指针变量

四:用指向数组的指针作为函数参数


 首先简单来讲,指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。下面将进行详细介绍。

一:回顾多维数组地址知识

(以二维数组为例)

int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

 1.1

a是数组名,a数组包括3行3列,可以理解为有三个行元素,而且每个行元素又是一个一维数组,其实数组在内存中真实存在的状态是连续的,并不分行列,但为了我们更好的理解,才想象成了有行有列的。即二维数组是由一维数组组成的,如 a数组是由3个一维数组组成的。

  1.2

还是以上面为例,a代表二维数组首元素地址(首行)起始地址,那么 a+1代表什么呢?

a+1 其实代表第二行首元素地址,也就是a[1] 的地址。这里的加一是表示越过这一行的地址。如果说 a 的地址为1000,则 a+1 的地址为1000+4*3=1012 (第0行有3个整形数据)。

   以此类推:a+2 也就是a[2] 的地址也就是1000+4*6=1024

那么第0行第1列的元素地址如何来表示呢?

因为从上可得知,a[0]是一维数组名,所以一维数组名+1不就是该一维数组中第一个元素么。这里的加一是表示越过这一个数据的地址,写为a[0]+1 地址值也就是 1000+4=1004 (1个整形据)。

  以此类推a[0]+0 , a[0]+1 , a[0]+2 等就代表着 a[0][0] , a[0][1] , a[0][2] 的元素地址。

二:二维数组的有关指针

如下表所示:

表示形式含义
a二维数组名,即首元素地址(0行起始地址)2000

a[0]

*(a+0)

*a

第0行第0列元素地址2000

a+1

&a[1]

第1行元素起始地址2012

a[1]

*(a+1)

第1行第0列元素a[1][0]地址2012

a[1]+2

*(a+1)+2

&a[1][2]

第1行第2列元素a[1][2]地址2020

*(a[1]+2)

*(*(a+1)+2)

a[1][2]

第1行第2列元素a[1][2]值元素值

 总结:记住最重要的一点 a[i] 与 *(a+i)是一样的。

三:指向数组元素的指针变量

 如:

#include <stdio.h>

int main()
{
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int* p;
	p = a[0];
	for (p; p < a[0] + 9; p++)
	{
		printf("%5d", *p);
		if( p[0] % 3 == 0)
			printf("\n");
	}
	return 0;
}

 结果:

    1    2    3
    4    5    6
    7    8    9

D:\VS\Project4\x64\Debug\Project4.exe (进程 1240)已退出,代码为 0。
按任意键关闭此窗口. . .

 分析:

p是一个指针变量,类型为 int * 型,其可以指向一般的整型变量,也可以指向整形的数组元素。

通过指针的方式将二维数组的值来依次输出。(用指向元素的指针变量输出二维数组各元素值)。

四:用指向数组的指针作为函数参数

 作用:用指针变量作形参,用来接受实参数组名传递来的地址。

  如:

#include <stdio.h>
void test(int* p)
{
	int* a = p;
	for (p; p < a+ 9; p++)
	{
		printf("%5d", *p);
		if (p[0] % 3 == 0)
			printf("\n");
	}
}
int main()
{
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int* p;
	p = a[0];
	test(p);
	return 0;
}

 结果:

    1    2    3
    4    5    6
    7    8    9

D:\VS\Project4\x64\Debug\Project4.exe (进程 13920)已退出,代码为 0。
按任意键关闭此窗口. . .

 分析:当p作为实参进行传递时,一定要保证形参的类型与实参类型一致。

用此种方法一样可以打印出来。(指向指针变量的指针变量)诠释了指向数组的指针作为函数参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335517.html

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

相关文章

Java线程中:Runnable和Callable的区别和联系

点个关注&#xff0c;必回关 文章目录一、Java提供了三种创建线程的方法1.继承Thread2.实现Runnable接口3.通过Callable和Future创建线程二、Runnable和Callable的区别和联系1.定义接口&#xff08;1&#xff09; Runnable&#xff08;2&#xff09;Callable&#xff08;3&…

onnx-graphsurgeon----ONNX计算图修改神器

0. 简介 作为深度学习用户&#xff0c;经常会听到ONNX、TensorRT等一系列常用的文件保存格式。而对于ONNX而言&#xff0c;经常我们会发现在利用TensorRT部署到NVIDIA显卡上时&#xff0c;onnx模型的计算图不好修改&#xff0c;在以前的操作中很多时候大佬是将onnx转换成ncnn的…

vscode中安装python运行调试环境

在运行代码之前&#xff0c;需要到微软商店下载安装python环境&#xff0c;35m&#xff0c;都是自动的。 1、安装python 的extensions插件。 ctrlshiftx 输入 python 后点击 install 按钮。 2、新建文件夹spider文件夹。 3、在新建文件夹spider下新建文件spider.py源代码。…

注册OpenAI体验ChatGPT实战演示

什么是ChatGPT ChatGPT&#xff0c;美国OpenAI 研发的聊天机器人程序 &#xff0c;于2022年11月30日发布的人工智能技术驱动的自然语言处理工具&#xff0c;能够真正像人一样完成交流和任务处理。日前&#xff0c;ChatGPT已经更新多个版本&#xff0c;很多大厂也都在接入其API。…

Spark On YARN时指定Python版本

坑很多&#xff0c;直接上兼容性最佳的命令&#xff0c;将python包上传到hdfs或者file:/home/xx/(此处无多余的/) # client 模式 $SPARK_HOME/spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --conf "spark.yarn.dist.archives<Python包…

超店有数,tiktok变现 |TikTok最新选品秘籍!让你爆单销量10W+

商家想要自家产品爆单&#xff0c;获得更高的转化&#xff0c;tiktok变现&#xff0c;选品很重要。但很多商家在选品上&#xff0c;找不到头绪。那不妨看看一下的内容&#xff0c;可以帮助你找到选品的思路方向和方法。一、tiktok选品方向1、 考虑垂直细分产品考虑垂直细分领域…

Vue3快速入门【二】

Vue3快速入门一、传值父传子&#xff0c;子传父v-model二、插槽2.1、匿名插槽2.2、具名插槽2.3、插槽作用域2.4、插槽作用域案例2.4.1、初始布局2.4.2、插槽使用2.4.3、点击编辑按钮获取本行数据&#xff08;插槽作用域的使用&#xff09;2.4.4、类型书写优化2.4.5、全局接口抽…

云计算|OpenStack|社区版OpenStack安装部署文档(十一--- 如何获取镜像---Rocky版)

前言&#xff1a; 前面我们使用虚拟机搭建了一个openstack集群&#xff0c;也就是在VM虚拟机的基础上模拟了一个简单的基于openstack社区版Rocky的私有云&#xff0c;但&#xff0c;不管任何部署安装工作&#xff0c;最后其实都是需要有实际的应用的&#xff0c;也就是常说的实…

拿来就用的Java海报生成器ImageCombiner(一)

背景如果您是UI美工大师或者PS大牛&#xff0c;那本文一定不适合你&#xff1b;如果当您需要自己做一张海报时&#xff0c;可以立马有小伙伴帮您实现&#xff0c;那本文大概率也不适合你。但是&#xff0c;如果你跟我一样&#xff0c;遇上到以下场景&#xff0c;最近公司上了不…

新手小白适合做跨境电商吗?

今天的跨境电商已经逐渐成熟&#xff0c;靠运气赚钱的时代早已过去&#xff0c;馅饼不可能从天上掉下来&#xff0c;尤其是你想做一个没有货源的小白劝你醒醒。做跨境电商真的不容易&#xff0c;要想做&#xff0c;首先要分析自己是否适合做。米贸搜整理了以下资料&#xff0c;…

硬件设计—高性能ADC前端电路

高性能模数转换器&#xff08;ADC&#xff09;一般对系统的性能有非常高的要求&#xff0c;而AD芯片的“前端”的输入电路设计对ADC系统的的性能有非常大的影响。以下主要介绍了ADC芯片前端输入使用放大器和变压器各自的优势。 1、放大器和变压器根本区别 放大器是有源器件&am…

Docker进阶 - 8. docker network 网络模式之 container

目录 1. container 模式概述 2. 使用Alpine操作系统来验证 container 模式 1. container 模式概述 container网络模式新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡&#xff0c;配置自己的IP&#xff0c;而是和一个…

ChatGPT注册+微信自动回复

ChatGPT注册微信自动回复1 注册OpenAI1.1 科学上网1.2 准备用于注册OpenAI的邮箱1.3 准备用于验证OpenAI的手机号1.4 注册OpenAI1.5 使用OpenAI2 基于ChatGPT微信实现自动回复2.1 原理2.2 实现ChatGPT是OpenAI基于GPT-3模型构建的自然语言处理模型&#xff0c;近几天ChatGPT突然…

这款浏览器火了,能快速使用ChatGPT,简单一看就会

当下ChatGPT很火&#xff0c;影响的人数非常广泛。作为聊天机器人模型&#xff0c;ChatGPT能完成写论文、编代码、写新闻、画画等高难度要求。那么&#xff0c;如何使用ChatGPT呢&#xff1f;下面介绍一下几个使用方法。值得一提的&#xff0c;目前已经有浏览器支持使用ChatGPT…

C++程序设计——多态:虚函数、抽象类、虚函数表

注&#xff1a;以下示例均是在VS2019环境下 一、多态的概念 通俗来讲&#xff0c;多态就是多种形态&#xff0c;当不同的对象去完成某个行为时&#xff0c;会产生出不同的状态。即不同继承关系的类对象&#xff0c;去调用同一函数时&#xff0c;产生不同的行为。 比如”叫“这…

【React】course

《千锋HTML5实战就业班React课程体系V16版本》课程资料 一、关于React 英文官网&#xff1a;https://reactjs.org/ 中文官网&#xff1a;https://zh-hans.reactjs.org/ React 起源于 Facebook 的内部项目&#xff0c;因为该公司对市场上所有 JavaScript MVC 框架&#xff0c…

JAVA工具篇--1 Idea中 Gradle的使用

前言&#xff1a; 既然我们已经使用Maven 来完成对项目的构建&#xff0c;为什么还要使用Gradle 进行项目的构建&#xff1b;gradle和maven都可以作为java程序的构建工具&#xff0c;但两者还是有很大的不同之处的&#xff1a;1.可扩展性&#xff0c;gradle比较灵活&#xff0c…

RabbitMQ-消息应答

一、介绍为了保证消息在发送过程中不丢失&#xff0c;rabbitmq引入消息应答机制&#xff0c;消息应答就是&#xff1a;消费者在接收到消息并且处理该消息之后&#xff0c;告诉rabbitmq它已经处理了&#xff0c;rabbitmq可以把该消息删除了。二、自动应答消息发送之后立即被认为…

pytest-fixture

fixture是pytest特有的功能&#xff0c;它用pytest.fixture标识&#xff0c;定义在函数前面。在编写测试函数的时候&#xff0c;可以将此函数的名称作为传入参数&#xff0c;pytest会以依赖注入方式将该函数的返回值作为测试函数的传入参数。fixture主要的目的是为了提供一种可…

从C语言向C++过渡

文章目录前言1.命名空间1.域的概念2.命名空间的使用2.C输入&输出3.缺省参数1.概念2.分类3.注意事项4.函数重载5.引用1.概念2.使用注意事项3.引用使用场景4.指针和引用的区别6.内联函数7.auto关键字8.nullptr前言 C被成为带类的C,本文由C语言向C过度&#xff0c;将会初步介…