C语言之指针(四)

一、前言

        哈喽大家好,经过前三次的学习,我们已经了解到了指针的诸多概念,同时也分别从计算机内存、&符号、机器位数和野指针等多方面去研究指针,那么接下来,我们要研究的是关于指针在数组中的应用,在此也附上上一篇关于指针的文章,以便大家参考。C语言之指针(三)-CSDN博客

二、数组名的理解

        我们在学习数组时,相信大家也学习过如下代码:

#include<stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* a = arr;return 0;
}

        上述代码是将arr数组中的首地址放入了一个整形指针变量a中,在此,arr则代表的是数组的首元素地址,由代码可知:

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

运行结果如下:

        我们发现数组名和首元素地址以及指针变量a所打印出的地址都是一样的,数组名就是首元素的地址(数组中第一个元素)。但是,需要注意的是,对于数组名就是首元素地址是正确的,不过却有两个例外:

        (1)sizeof(数组名):sizeof中单独存放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。

        (2)&(数组名):&(数组名)表示的是整个数组的地址,为了方便理解,我们用代码体现:

#include<stdio.h>int main()
{int arr[3] = { 1,2,3 };int(*a)[3] = &arr;printf("%p\n", arr);//首元素地址printf("%p\n", &arr);//整个数组的地址printf("%p\n", &arr + 1);//数组地址+1的地址printf("%p\n", a + 1);//数组地址+1的地址return 0;
}

代码结果如下:

        对于整个数组地址来说,它的起始地址为首元素地址,但是&arr与arr不同之处在于,arr+1跳过的是1个元素,4个字节,而对于&arr+1来说,他跳过的是数组中全部的元素个数,也就是元素个数*4字节。

        如上图所示,arr首元素地址为0073FD90,当他跳过3*4字节后,就变成了0073FD9C,正好跳过12个字节。

        所以我们以后写代码时,要格外注意这些细节。

总结:数组名是数组首元素的地址,但是有2个例外。

三、使用指针访问数组

        通常情况下,我们写代码打印数组中的每一个元素,如下所示:

#include<stdio.h>int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

        但是如果通过指针来打印每一个元素,如下所示:

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

四、一维数组传参的本质

        接下来,我们讲一下数组传参的问题。

        首先,对于计算数组内部元素个数的问题,我们通常会以如下代码实现:

#include<stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int len = sizeof(arr) / sizeof(arr[0]);printf("%d\n", len);return 0;
}

        但是如果我们把计算数组元素个数的代码写成一个函数,那么这种方法还能够实现吗?

#include<stdio.h>void my_size(int arr[])
{int len = sizeof(arr) / sizeof(arr[0]);printf("%d\n", len);
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int len = sizeof(arr) / sizeof(arr[0]);printf("%d\n", len);my_size(arr);return 0;
}

        由上图可知,通过传参的方式求数组长度是行不通的。

       这就要学习数组传参的本质了,上个模块我们学习了:数组名是数组首元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址。

五、二级指针

        指针是地址,那么存储指针的被称为指针变量,但指针变量也是变量,是变量就会有地址,而 存储指针变量地址的就叫做二级指针。为了大家更好的去理解二级指针的关系概念,我们还是以数形结合的方式去理解,具体如下:

对二级指针的运算:

        通过解引用pnn(*pnn)得到的是pn,也就是n的地址,再进行一步解引用(**pnn)就能直接访问n。

        由此可见,对不同的指针通过不同的解引用都可以访问n,以达到对n的操作。

六、指针数组

        对于指针数组的学习,我们可以类比一下整数数组和字符数组,其中整数数组是存放整数的数组,字符数组是存放字符的数组,而指针数组就是存放指针的数组。

        指针数组中每个元素都是指针,而这些指针又可以指向一块区域。

         总而言之,指针数组的本质还是数组。

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

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

相关文章

北美IDC租赁价格暴涨超6成 我国会如此吗?

据UBS&#xff08;瑞银集团&#xff09;北美云厂调研&#xff0c;在大模型等人工智能技术的快速发展下&#xff0c;受电力、散热等因素影响&#xff0c;北美数据中心供给越发紧张&#xff0c;据当地经纪人反馈&#xff0c;部分数据中心开工前已经被预定&#xff0c;机柜租赁价格…

有趣的前端知识(三)

推荐阅读 有趣的前端知识&#xff08;一&#xff09; 有趣的前端知识&#xff08;二&#xff09; 文章目录 推荐阅读JS内置对象JS外部对象BOM模型history对象screen对象navigator对象 DOM&#xff08;文档对象模型&#xff09;DOM的方法&#xff08;对于节点的操作&#xff09…

go语言基础笔记

1.基本类型 1.1. 基本类型 bool int: int8, int16, int32(rune), int64 uint: uint8(byte), uint16, uint32, uint64 float32, float64 string 复数&#xff1a;complex64, complex128 复数有实部和虚部&#xff0c;complex64的实部和虚部为32位&#xff0c;complex128的实部…

HM v.16.22 顺序读源码day3---TEncTop.cpp

文章目录 TEncTop.cpp引言Void TEncTop::encode执行流程实现细节Class TEncTopVoid TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic, Int ppsId ) TEncTop.cpp 引言 TEncTop类是第二层编码类&#xff0c;也是执行实际编码计算工作的最顶层编码类。 Void TEncTop::encode是…

C#,数值计算,矩阵相乘的斯特拉森(Strassen’s Matrix Multiplication)分治算法与源代码

Volker Strassen 1 矩阵乘法 矩阵乘法是机器学习中最基本的运算之一,对其进行优化是多种优化的关键。通常,将两个大小为N X N的矩阵相乘需要N^3次运算。从那以后,我们在更好、更聪明的矩阵乘法算法方面取得了长足的进步。沃尔克斯特拉森于1969年首次发表了他的算法。这是第…

初识微信小程序之swiper和swiper-item的基本使用

在我还没接触到微信小程序之前&#xff0c;通常使用轮播要么手写或使用swiper插件去实现&#xff0c;当我接触到微信小程序之后&#xff0c;我看到了微信小程序的强大之处&#xff0c;让我为大家介绍一下吧&#xff01; swiper与swiper-item一起使用可以做轮播图 基本使用&…

【北京大学】徐高《金融经济学二十五讲》

一、经济的任务 经济的任务之一是确保有效地分配稀缺资源&#xff0c;这是经济学中的一个核心问题。资源是有限的&#xff0c;而需求是无限的&#xff0c;因此经济系统需要通过合理的机制来分配资源以满足社会的需求。以下是关于经济分配资源的几个方面&#xff1a; 1. 资源配…

ChatGPT-Next-Web SSRF漏洞+XSS漏洞复现(CVE-2023-49785)

0x01 产品简介 ChatGPT-Next-Web 是一种基于 OpenAI 的 GPT-3.5 、GPT-4.0语言模型的产品。它是设计用于 Web 环境中的聊天机器人,旨在为用户提供自然语言交互和智能对话的能力。 0x02 漏洞概述 2024年3月,互联网上披露CVE-2023-49785 ChatGPT-Next-Web SSRF/XSS 漏洞,未经…

【小黑嵌入式系统第十九课】结课总结(三)——操作系统部分(RTOSμC/OS-Ⅲ程序设计基础(任务函数时间临界区通信))

上一课&#xff1a; 【小黑嵌入式系统第十八课】结课总结&#xff08;二&#xff09;——软件部分&#xff08;系统架构&调试&测试&运行&系统软件设计&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0…

前端基础篇-深入了解用 HTML 与 CSS 实现标题排版

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 HTML 与 CSS 概述 2.0 HTML - 标题排版 2.1 图片标签 2.2 标题标签 2.3 水平标签 2.4 实现标题排版 3.0 HTML - 标题样式(style 样式) 3.1 CSS 的引入方式 3.2…

案例分析篇06:数据库设计相关28个考点(17~22)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

安装linux_centos7虚拟机_开启网络_ssh_防火墙

文章目录 安装linux_centos7虚拟机_开启网络_ssh_防火墙安装centos7虚拟机1. 进入VMware --> 点击文件 --> 新建虚拟机2. 选择典型 --> 选择下一步3. 选择--> 稍后安装操作系统4. 选择--> Linux --> CentOS 7 64位5. 在虚拟机名称输入(虚拟机名) --> 选择…