C语言:深入理解指针(3)

目录

一、数组名的理解

二、用指针访问数组

三、一维数组传参的本质

四、冒泡排序

五、二级指针

六、指针数组

七、指针数组模拟二维数组

八、结语


一、数组名的理解

数组名其实就是首元素的地址

int arr[3] = {1,2,3};
printf("arr   :%p\n" ,arr);
printf("arr[0]:%p\n" ,&arr[0]);

可以看到,数组名确实就是首元素的地址,但是有没有想到这个语句?

int r = sizeof(arr)/sizeof(arr[0]);

这是用来求数组的元素个数的,在这里,数组名是个例外,它表示整个数组

既然数组名就是首元素地址,那么 &arr 又代表这什么呢?

int arr[3] = {1,2,3};
printf("arr:    %p\n",arr);
printf("arr+1:  %p\n" ,arr+1);
printf("&arr:   %p\n" ,%arr);
printf("&arr+1: %p\n" ,&arr+1);

可以看到,&arr 和 arr 的地址是一样的,但是&arr 拥有的权限是整个数组,而arr的权限只有一个元素,因此,他们分别+1的结果就不同了

二、用指针访问数组

通常我们访问数组元素使用下标的

printf("%d ",arr[2]);

既然数组名就是首元素地址,那我是不是可以通过指针来访问呢,比如解引用首元素的指针?

printf("%d ",*arr);

没问题,而我们又知道数组在内存中的存储是连续的,那我知道了首元素的地址,那我岂不是也可以找到其他元素的地址,然后对其解引用,就可以访问其他数组元素了?

for(int i = 0; i<3;i++)
{printf("%d " ,*(arr+i));
}

没有问题,到此,我们可实现用指针访问数组了。

但是,你有没有想过,数组名 arr 是地址,可以通过 arr[2] 来访问第三个元素,而我们的指针也存放的是地址,那我们的指针可不可以也能这样 P[2] 访问其他元素呢?

int* p = arr;
for(int i = 0; i<3;i++)
{printf("%d ",p[i]);
}

也没问题!是不是很震惊!当然,要注意的是,是用了方括号就不要再带解引用了哦

我要开始搞事情了,由以上分析可得:*(p+i) == p[ i ] 而  *(p+i) == *(i+p) == i[ p ] 了?

int* p = arr;
for (int i = 0; i < 3; i++)
{printf("%d ",i[p]);
}
return 0;

成功了!是不是更感觉很震惊了!当然,这是另类的写法,我们一般还是要按照常理出牌,不然会被说成是猪队友的

三、一维数组传参的本质

大家有没有经历过在自己写的函数中,求数组长度是错误的!

void Fun_arr(int arr[])
{int sz = sizeof(arr)/sizeof(arr[0]);
}

为什么求出来是1呢,这是因为数组传参本质上传的就是首元素的地址,所以求出来只有一个元素

四、冒泡排序

核心思想:两两相邻元素的比较

14253

这是一个无序数列,现在我们要将其变为升序序列,那就先把第一个元素和第二元素比较,把大的方后面,1 小于4,所以不用管,接下来比较第二个元素和第三个元素,4大于2 ,我们需要把大的放后面,把2和4位置对调:

12453

最后就变成了:

12435

发现没有,我们进行一次,就把最大的弄的最后面去了,那我们再多进行几次,不就把第二大,第三大的也弄后面去了?

第二次:

12345

这里刚好就完成了排序。冒泡排序需要视频讲解更方便,图文讲解起来比较费劲,我这里就就不多说了,下面是冒泡排序的代码:

void Bubble_sort(int arr[], int sz)
{for (int i = 0; i < sz - 1; i++){for (int j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j+1]){//交换int mid = arr[j];arr[j] = arr[j + 1];arr[j + 1] = mid;}}}
}

五、二级指针

二级指针就是该指针指向的变量仍然是一个指针,相应的还有三级指针,n级指针

int a = 10;
int* pa = &a;
int** ppa = &pa;//这里的ppa就是二级指针了

int** ppa = &pa;  这里的 int* 说明ppa指向的变量的类型,第二个 * 说明ppa是指针变量

当然你要是想找到a,就要对ppa进行两次解引用。

六、指针数组

前面将指针的时候说了,有整型数组,里面放的全是整型,字符型数组,里面放的全是字符型,那么,指针数组里面放的全部都是指针喽。

int a = 10;
int b = 20;
int c = 30;
int* pa = &a;
int* pb = &b;
int* pc = &c;
int* arr[3] = {pa,pb,pc};

七、指针数组模拟二维数组

为了巩固指针数组的理解,我们需要完成一个任务:用指针数组模拟一个二位数组

在学习二维数组的时候,讲了二维数组在内存中的存储是一行挨着一行的,那我们可以把每行的首元素的地址作为一个数组的元素,具体来讲就是这个样子:

int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
int* str[] = {arr1,arr2,arr3};
for(int i = 0; i<3;i++)
{for(int j = 0; j<5;j++){printf("%d ", str[i][j] );}printf("\n");
}

关于这里的打印,前面说了,可以用指针加方括号的形式打印,所以就写成了 str[ i ][ j ],因为    str[ i ] 表示的是一个地址嘛。

八、结语

指针的学习没有终点。继续探索,挑战自己,你将发现C语言指针的强大之处,并能编写出更高效、更灵活的代码。愿你在C语言指针的世界里越走越远,收获满满!

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

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

相关文章

Spring MVC 接口的访问方法如何设置

RequestMapping 是 Spring 框架中用于映射 HTTP 请求到控制器方法的注解。它支持以下 HTTP 方法访问类型&#xff0c;通过 method 属性指定&#xff1a; GET&#xff1a;用于获取资源POST&#xff1a;用于提交数据PUT&#xff1a;用于更新资源DELETE&#xff1a;用于删除资源PA…

linux libdbus使用案例

以下是一个基于 Linux libdbus 的详细指南,包含服务端和客户端的完整代码示例,涵盖 方法调用、信号发送 和 异步消息处理。libdbus 是 D-Bus 的底层 C 库,直接操作 D-Bus 协议,适合需要精细控制的场景。 1. libdbus 的核心机制 连接管理:通过 dbus_bus_get 连接系统总线或…

Day118 | 灵神 | 二叉树 | 删点成林

Day118 | 灵神 | 二叉树 | 删点成林 1110.删点成林 1110. 删点成林 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 最直接的思路就是看当前结点的值是不是在要删除的列表中&#xff0c;在的话删除当前结点并把左右孩子加入res中 很可惜这样是错的&#xff0c;…

趣味编程:钟表

目录 1. 效果展示 2. 源码展示 3. 逻辑概述 3.1 表针绘制函数&#xff08;DrawHand&#xff09; 3.2 表盘绘制函数 3.3 主程序逻辑 4. 小结 概述&#xff1a;本篇博客主要介绍简易钟表的绘制。 1. 效果展示 该钟表会随着系统的时间变化而变化&#xff0c;动态的效…

ansible进阶02

管理主机清单变量 使用变量的原则 变量创建的位置 角色的defaults或vars目录主机清单playbook或主机清单所在位置的子目录group_vars和host_varsplay或角色或任务 无论在哪创建变量&#xff0c;都应该遵守一些规则&#xff1a; 保持简洁不要重复造轮子。不要反复在多个位置…

C40-指针

一 指针的引入 什么是指针:指针是一个变量&#xff0c;其值是另一个变量的内存地址 简单的使用地址输出一个变量: 代码示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*号是取值运算符…

Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查

Nginx 返回 504 状态码表示 网关超时&#xff08;Gateway Timeout&#xff09;&#xff0c;这意味着 Nginx 作为反向代理服务器&#xff0c;在等待上游服务器&#xff08;如后端应用服务器、数据库服务器等&#xff09;响应时&#xff0c;超过了预设的时间限制&#xff0c;最终…

DeepSeek推理优化技巧:提升速度与降低成本

文章目录 DeepSeek推理优化技巧&#xff1a;提升速度与降低成本引言一、模型优化&#xff1a;减少模型参数与计算量1. 模型剪枝&#xff08;Pruning&#xff09;2. 模型量化&#xff08;Quantization&#xff09;3. 知识蒸馏&#xff08;Knowledge Distillation&#xff09; 二…

深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】

一、技术架构与核心能力解析 1.1 时空建模体系的创新突破 Sora 在视频生成领域的核心优势源于其独特的时空建模架构。区别于传统将视频拆解为单帧处理的模式,Sora 采用时空 Patch 嵌入技术,将连续视频序列分割为 32x32 像素的时空块(每个块包含相邻 3 帧画面),通过线性投…

【实战篇】数字化打印——打印部署管理接口开发

前言 前面的章节已经介绍了打印管理模块的主要界面设计&#xff0c;本篇介绍用myBuilder开发界面接口&#xff0c;实现最终的功能。 1. 配置打印应用菜单 首先配置挂载好模块菜单 让菜单点击能访问到对应的页面 2. 打印部署管理数据表详细设计 以下是打印部署管理的数据表字…

Window下Jmeter多机压测方法

1.概述 Jmeter多机压测的原理&#xff0c;是通过单个jmeter客户端&#xff0c;控制多个远程的jmeter服务器&#xff0c;使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于&#xff1a; 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…

ResourceBundle多语言国际化

在 Java 中&#xff0c;ResourceBundle 是一个用于国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;的一种机制&#xff0c;它使得程序能够根据不同的区域设置&#xff08;如语言、国家等&#xff09;加载不同的资源文件。ResourceBundle 主要用于从外…

精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶

精益数据分析&#xff08;62/126&#xff09;&#xff1a;从客户访谈评分到市场规模估算——移情阶段的实战进阶 在创业的移情阶段&#xff0c;科学评估用户需求与市场潜力是决定产品方向的关键。今天&#xff0c;我们结合Cloud9 IDE的实战经验与《精益数据分析》的方法论&…

第四天——贪心算法——种花

1. 题目 有一个花坛&#xff0c;其中0 表示该位置是空的&#xff0c;可以种花。1 表示该位置已经有花&#xff0c;不能种花。 规则&#xff1a;新种的花不能种在相邻的位置&#xff08;即如果某个位置已经种了花&#xff0c;它的左右两个相邻位置不能再种花&#xff09;。给定…

【重磅】配电网智能软开关和储能联合规划

目录 1 主要内容 目标函数 数据说明 节点系统图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《具有源荷不平衡特性的配电网智能软开关和储能联合规划》部分模型&#xff0c;未考虑聚类分析和分布鲁棒部分&#xff0c;就智能软开关和储能联合规划部分进行了…

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示 📢 前言: 作为一名键盘爱好者,近期研究了QMK固件的OLED显示屏配置,发现网上的教程要么太过复杂,要么过于简单无法实际操作。因此决定写下这篇教程,从零基础出发,带大家一步步实现键盘OLED屏幕的配置与个性化显示…

中国科学院计算所:从 NFS 到 JuiceFS,大模型训推平台存储演进之路

中科院计算所在建设大模型训练与推理平台过程中&#xff0c;模型规模与数据集数量呈爆发式增长。最初采用简单的裸机存储方案&#xff0c;但很快面临数据孤岛、重复冗余、管理混乱和资源利用不均等问题&#xff0c;于是升级到了 NFS 系统。然而&#xff0c;随着使用强度增加&am…

飞牛NAS本地部署开源TTS文本转语音工具EasyVoice与远程使用流程

文章目录 前言1. 环境准备2. Docker部署与运行3. 简单使用测试4. 安装内网穿透4.1 开启ssh连接安装cpolar4.2 创建公网地址 5. 配置固定公网地址总结 前言 本文主要介绍如何在fnOS飞牛云NAS使用Docker本地部署一款非常好用的开源TTS文本转语音工具EasyVoice&#xff0c;并结合…

部署安装jenkins.war(2.508)

实验目的&#xff1a;部署jenkins&#xff0c;并与gitlab关联bulid 所需软件&#xff1a;jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机&#xff1a;8.10具有java环境,内存最少为4G&#xff0c;cpu双核 目录 jdk安装 …

AEO认证的好处 ,如何快速获取AEO认证?

AEO认证的好处及快速获取方法 AEO&#xff08;Authorized Economic Operator&#xff0c;经认证的经营者&#xff09; 是海关对符合国际供应链安全标准的企业给予的认证&#xff0c;分为 AEO一般认证 和 AEO高级认证。获得AEO认证可享受多项通关便利&#xff0c;提升企业国际贸…