【C语言】_指针与数组
目录
1. 数组名的含义
1.1 数组名与数组首元素的地址的联系
1.3 数组名与首元素地址相异的情况
2. 使用指针访问数组
3. 一维数组传参的本质
3.1 代码示例1:函数体内计算sz(sz不作实参传递)
3.2 代码示例2:sz作为实参传递
3.3 结论
4. 指针数组
1. 数组名的含义
1.1 数组名与数组首元素的地址的联系
从值的角度来看,数组名 = 数组首元素的地址,即arr = &arr[0] ;
#include<stdio.h>int main() {int arr[10] = { 0 };printf("arr = %p\n", arr);printf("&arr[0] = %p\n", &arr[0]);return 0;
}
运行结果如下:
1.3 数组名与首元素地址相异的情况
大多数情况下,数组名=数组首元素地址,但是有两个例外:
1、sizeof(数组名):此时数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小(单位为B):
#include<stdio.h>int main() {int arr[10] = { 0 };printf("sizeof(&arr[0]) = %d\n", sizeof(&arr[0]));printf("sizeof(arr) = %d\n", sizeof(arr));return 0;
}
运行结果如下:
2、&(数组名):此时数组名也表示整个数组,&(数组名)得到的是整个数组的地址:
(虽然在值上体现为相同,但本质/指针类型是不同的)
#include<stdio.h>int main() {int arr[10] = { 0 };printf("&arr[0] = %p\n",&arr[0]);printf("arr = %p\n", arr);printf("&arr = %p\n", arr);printf("---------------------\n");printf("&arr[0]+1 = %p\n", &arr[0]+1);printf("arr+1 = %p\n", arr + 1);printf("&arr+1 = %p\n", &arr + 1);return 0;
}
运行结果如下:
由于指针+1的具体跨度与指针类型有关:
&arr[0]与arr均表示数组首元素地址,指针类型为int*,故指针+1则跳过4B;
&arr表示数组的地址,指针类型为数组指针,故指针+1则跳过整个数组即10×4B=40B;
2. 使用指针访问数组
代码示例1:
int main() {int arr[10] = {0};int* p = arr;int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++) {scanf("%d", p + i);}for (int i = 0; i < sz; i++) {printf("%d ", *(p+i));}return 0;
}
输出结果为:
代码示例2:
int main() {int arr[10] = { 0 };int* p = arr;int* start = p;int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++) {scanf("%d", p);p++;}for (int i = 0; i < sz; i++) {printf("%d ", *start);start++;}return 0;
}
运行结果为:
代码示例3:
int main() {int arr[10] = { 0 };int* p = arr;int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++) {scanf("%d",p+i);}for (int i = 0; i < sz; i++) {printf("%d ",arr[i]);}return 0;
}
运行结果为:
注:关于下标引用操作符:
理解数组元素与指针解引用的对应:arr [ i ] 即 * ( arr + i ),其中 [ ] 为下标引用操作符,
编译时,arr [ i ] 会被处理为* ( arr + i ),实际上i [ arr ] 也会被处理为* ( i + arr );
3. 一维数组传参的本质
现要求编写程序,使用函数实现一维数组arr的元素打印;
3.1 代码示例1:函数体内计算sz(sz不作实参传递)
void Print(int arr[10]) {int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++) {printf("%d ", *(arr + i));}
}
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };Print(arr);return 0;
}
运行结果如下:
调试如下:
可见在函数Print内计算sz出现错误,从而导致函数功能未能正确实现;
分析代码如下:(见注释)
void Print(int arr[10]) { // 形参arr[10]:数组传参时,可以写为数组形式;但其本质是指针变量,而非完整的数组int sz = sizeof(arr) / sizeof(arr[0]); // sz求得指针变量大小=1for (int i = 0; i < sz; i++) {printf("%d ", *(arr + i));}
}
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };Print(arr); // 实参arr:数组首元素地址return 0;
}
3.2 代码示例2:sz作为实参传递
void Print(int* arr, int sz) {for (int i = 0; i < sz; i++) {printf("%d ", *(arr + i));}
}
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);Print(arr, sz);return 0;
}
3.3 结论
1、数组传参的本质是传递了数组首元素的地址;
2、数组传参时,形参可以写为数组形式,但本质仍是指针变量,而不是完整的数组,故而建议将形参写为指针形式而非数组形式:
void Print(int* arr, int sz) {for (int i = 0; i < sz; i++) {printf("%d ", *(arr + i));}
}
3、数组传参时,形参的数组不会单独再创建数组空间,故形参的数组可省略数组大小,即形参可写为以下形式:
void Print(int arr[], int sz) { for (int i = 0; i < sz; i++) {printf("%d ", *(arr + i));}
}
4、数组传参时,数组大小sz必须在函数体外计算并作为参数传递给函数;
4. 指针数组
类比整型数组,即存放整型变量的数组;字符数组,即存放字符变量的数组;
指针数组即存放指针变量的数组;
现利用指针数组模拟二维数组:
int main() {int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int* arr[3] = { arr1,arr2,arr3 };for (int i = 0; i < 3; i++) {for (int j = 0; j < 5; j++) {/*printf("%d ",*(arr[i]+j));*/printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
注:(1)对于模拟实现的二维数组的元素访问,arr [ i ] [ j ]等价于 * ( arr [ i ] + j),编译时编译器会将数组元素的访问解析为指针运算;
(2)真正的二维数组是在内存中逐行连续存放的,本例中模拟实现的二维数组仅实现了每一个子一维数组的连续存放,并不是真正的二维数组;
相关文章:

【C语言】_指针与数组
目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1:函数体内计算sz(sz不作实参传递) 3.2 代码示例2:sz作为实参传递 3…...
Selenium 的四种等待方式及使用场景
Selenium 的四种等待方式及使用场景 隐式等待(Implicit Wait)显式等待(Explicit Wait)自定义等待(Custom Wait)固定等待(Sleep) 1. 隐式等待 定义: 隐式等待是为 WebD…...
React知识盲点——组件通信、性能优化、高级功能详解(大纲)
组件通信 React 组件通信详解 在 React 中,组件通信是一个核心概念,主要指的是如何让不同的组件共享和传递数据。React 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式,包括:父子组件通信&…...

Vue 按键生成多个表单
本文通过 vueele,通过循环ref的方法生成多个表单,代码如下: <template><div><el-button click"addText" style"margin: 15px 0; ">添加字段</el-button><div v-for"item, index in dataList"…...

网络安全:交换机技术
单播,组播广播 单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。组播(multicast): 也叫多播&am…...
Flask 快速入门
1. Flask 简介 1.1 什么是 Flask Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不…...
C#设计模式(行为型模式):备忘录模式,时光倒流的魔法
C#设计模式:备忘录模式,时光倒流的魔法 在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如: 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。事务回滚&am…...

数据库高安全—角色权限:权限管理权限检查
目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限:角色创建角色管理,从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍,本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...
FastAPI 的依赖注入与生命周期管理深度解析
FastAPI 的依赖注入与生命周期管理深度解析 目录 🔧 依赖注入与 FastAPI 高级特性 1.1 依赖注入的基础与核心概念1.2 FastAPI 的依赖注入机制与设计理念1.3 FastAPI 依赖注入的异步特性 🕹 生命周期与依赖的异步管理 2.1 依赖的生命周期管理࿱…...

【express-generator】05-路由中间件和错误处理(第一阶段收尾)
一、前言 上篇文章我们介绍了express-generator的请求体解析,重点讲了常用的请求体数据格式(JSON/URL 编码的表单数据)以及一个FILE文件上传,同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识,…...
Linux环境下确认并操作 Git 仓库
在软件开发和版本控制中,Git 已成为不可或缺的工具。有时,我们需要确认某个目录是否是一个 Git 仓库,并在该目录中运行脚本。本文将详细介绍如何确认 /usr/local/src/zcxt/backend/policy-system-backend 目录是否是一个 Git 仓库,…...

UDP -- 简易聊天室
目录 gitee(内有详细代码) 图解 MessageRoute.hpp UdpClient.hpp UdpServer.hpp Main.hpp 运行结果(本地通信) 如何分开对话显示? gitee(内有详细代码) chat_room zihuixie/Linux_Lear…...

NVIDIA在CES 2025上的三大亮点:AI芯片、机器人与自动驾驶、全新游戏显卡
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜
AI的两次寒冬:从感知机困局到深度学习前夜 引用(中英双语) 中文: “第一次AI寒冬,是因为感知机局限性被揭示,让人们失去了对算法可行性的信心。” “第二次AI寒冬,则是因为专家系统的局限性和硬…...

transformer深度学习实战CCTSDB中国交通标志识别
本文采用RT-DETR作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。RT-DETR以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对CCTSDB交通标志数据集进行训练和优化,该数据集包含丰富的CCTSDB交…...

JavaWeb开发(六)XML介绍
1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。 (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。 (3&a…...
使用pbootcms开发一个企业官网
V:llike620 pbootcms开源PHP建站系统 https://www.pbootcms.com/ 配置网站 域名解析后,网站绑定到程序根目录即可 例如:本地域名是dobot.test ,那么也要同步本地的hosts是 127.0.0.1 dobot.test 需要配置下伪静态规则 location / {if (!-e $r…...

Linux C编程——文件IO基础
文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(人民医院的信息系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划风险管理2、项目风险识别3、风险定性分析4、风险定量分析5、制定风险应对6、实施风险应对计划7、监督风险论文 2022年6月,我作为项目经理承担了XX县人民医院的信息系统建设,该项目总投资300万,其…...

UE播放声音
蓝图中有两个播放声音的函数 Play Sound 2D 和 Play Sound at Location Play Sound 2D没有声音距离衰减,一般用于界面ui Play Sound at Location 有声音距离衰减,一般用于枪声,场景声等,比较常用...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...