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

news/2024/10/21 3:27:27/

 

目录

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

二:二维数组的有关指针

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

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


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

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

(以二维数组为例)

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    34    5    67    8    9D:\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    34    5    67    8    9D:\VS\Project4\x64\Debug\Project4.exe (进程 13920)已退出,代码为 0。
按任意键关闭此窗口. . .

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

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


http://www.ppmy.cn/news/23993.html

相关文章

lwip-数据收发流程2-传输层

三.传输层&#xff08;主讲TCP协议&#xff09;&#xff08;tcp_input&#xff09;TCP连接的建立过程&#xff08;三次握手&#xff09;&#xff1a;1. 客户端发送一个SYN标志置1的TCP数据报&#xff0c;握手包中指明源端口和目的端口&#xff0c;同时告知客户端初始序号seqno_…

NLP顶会近三年小众研究领域

ACL 2022 编码器和解码器框架、自然语言生成、知识i神经元、抽取式文本摘要、预训练语言模型、零样本神经机器翻译等。 2021 新闻标题生成任务等。跨语言命名实体识别、代码搜索、音乐生成、Hi-Transformer、预训练语言模型、语义交互等。 EMNLP 2021 代码摘要生成、隐私…

微信小程序内部那些事

微信小程序没有window、document&#xff0c;它更像是一个类似 Node.js 的宿主环境。因此在小程序内部不能使用 document.querySelector 这样的选择器&#xff0c;也不支持 XMLHttpRequest、location、localStorage 等浏览器 API&#xff0c;只能使用小程序自己提供的 API&…

shell脚本免交互与expect

目录 Here Document 定义 格式 注意 例子 统计行数 修改密码​编辑 expect 定义 基本命令 实验 免交互ssh主机 Here Document 定义 使用I/O重定向的方式将命令列表提供给交互式程序 格式 命令<< 标记....标记 注意 标记可以使用任意的合法字符&#xf…

IT人的晋升之路——关于人际交往能力的培养

对于咱们的程序员来说&#xff0c;工作往往不是最难的&#xff0c;更难的是人际交往和关系的维护处理。很多时候我们都宁愿加班&#xff0c;也不愿意是社交&#xff0c;认识新的朋友&#xff0c;拓展自己的圈子。对外的感觉就好像我们丧失了人际交往能力&#xff0c;是个呆子&a…

【c++】类和对象:让你明白“面向一个对象有多重要”:构造函数,析构函数,拷贝构造函数的深入学习

文章目录 什么是面向对象&#xff1f;一&#xff1a;类是什么&#xff1f; 1.类的访问限定符 2.封装 3.类的实例化 4.this指针二&#xff1a;类的6个默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数什么是面向对象&#xff1f; c语言是面向…

nginx相关反爬策略总结笔记

引言 互联网站点的流量一部分由人类正常访问行为产生&#xff0c;而高达30%-60%的流量则是由网络爬虫产生的&#xff0c;其中一部分包含友好网络爬虫&#xff0c;如搜索引擎的爬虫、广告程序、第三方合作伙伴程序、Robots协议友好程序等;而并非所有的网络爬虫都是友好的&#x…

SPSS数据分析软件的安装与介绍(附网盘链接)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…