指针的进阶【上篇】
文章目录
- 📀1.字符指针
- 📀2.指针数组
- 📀3.数组指针
- 💿3.1.数组指针的定义
- 💿3.2. &数组名VS数组名
- 💿3.3.数组指针的使用
📀1.字符指针
int main()
{char ch = 'w';char* pc = &ch;// pc就是字符指针char* p = "abcdef";// 把字符串首元素地址放在p中*p = 'w';return 0;
}
👉表达式的值是首元素的地址
👉但是这段代码运行起来会崩掉,调试看一下👇

👉因为这里的 “abcdef” 是常量字符串,不能被修改
int main()
{char arr[] = "abcdef";char* p = arr; // p指向的是arr数组首元素地址,arr数组是可以修改的*p = 'w';printf("%s\n", arr);// wbcdefreturn 0;
}

这里就可以很好的运行,因为p指向的是arr数组首元素地址,arr数组是可以修改的
👉字符指针不仅仅可以指向字符,还可以指向字符串,但其实指向的还是字符串首字符,但是可以顺藤摸瓜找到整个字符串的字符,指向数组也是一样的
💡看一道例题👇
int main()
{char str1[] = "hello programming.";char str2[] = "hello programming.";const char* str3 = "hello programming.";const char* str4 = "hello programming.";if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}
输出的两个结果分别是什么呢?

🔔这里str3和str4指向的是同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。
📀2.指针数组
👉类比一下:
字符数组 ---- 存放字符的数组
char arr1[10];
整型数组 ---- 存放整型的数组
int arr2[5];
指针数组 ---- 存放的就是指针
eg:存放字符指针的数组 ---- 字符指针数组
char* arr3[5];
eg:存放整型指针的数组 ---- 整形指针数组
int* arr4[6];
举个栗子🌰:
eg1:👇
int main()
{char* arr[] = { "abcdef","hehehe","666" };int i = 0;for (i = 0; i < 3; i++){printf("%s\n", arr[i]);}return 0;
}

eg2:👇
一维数组模拟一个二维数组
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };//arr是一个存放整型指针的数组int* arr[] = { arr1,arr2,arr3 };int i = 0;for (i = 0; i < 3; i++) //行{int j = 0;for (j = 0; j < 5; j++) //列{printf("%d ", *(arr[i] + j));// printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

📀3.数组指针
💿3.1.数组指针的定义
👉类比一下:
整型指针 ---- 指向整型的指针
int a = 10;
int* p = &a;
字符指针 ---- 指向字符的指针
char ch = ’w‘;
char* pc = &ch;
数组指针 ---- 指向数组的指针 ---- 存放的是数组的地址
int arr[10];
int ( * pa)[10] = &arr; 取出的是数组的地址
char arr[10];
char ( * pc)[10] = &arr;
int* arr[5];
int * (*p)[5] = &arr;
💿3.2. &数组名VS数组名
💡数组名绝大部分情况下是数组首元素的地址
💡有两个例外:1. sizeof (数组名)------ sizeof 内部单独放一个数组名的时候,数组名表示的是整个数组,计算得到的是数组的总大小
2. &arr ------ 这里的数组名表示整个数组,取出的是整个数组的地址,从地址值的的角度来讲,和数组首元素的地址是一样的,但是意义不一样
int main()
{int arr[10] = { 0 };printf("%p\n", sizeof(arr));printf("%p\n", arr);printf("%p\n", &arr[0]);printf("%p\n", &arr);return 0;

在看一下这段代码及解析👇
int main()
{int arr[10] = { 0 };//printf("%p\n", sizeof(arr));printf("%p\n", arr);//int*printf("%p\n", arr+1);//4printf("%p\n", &arr[0]);//int*printf("%p\n", &arr[0]+1);//4printf("%p\n", &arr);//int(*)[10]printf("%p\n", &arr+1);//40int(*p)[10] = &arr;//p是一个数组指针//int(*)[10]return 0;
}

👉根据第一段代码我们发现,其实 &arr 和 arr,虽然值是一样的,但是意义应该不一样的
👉实际上: &arr 表示的是数组的地址,而不是数组首元素的地址(细品)
👉第二段代码中 &arr 的类型是:int (*)[10],是一种数组指针类型,数组指针的地址+1,跳过整个数组大小, 所以&arr+1 相对于&arr 的差值是40
💿3.3.数组指针的使用
我们直接上代码和注释(请细品🍔)👇
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);//使用指针来访问//int* p = arr;//for (i = 0; i < sz; i++)//{// printf("%d ", *(p + i));//}int(*p)[10] = &arr;//p ---- &arr//*p ---- *&arr//*p ---- arrfor (i = 0; i < sz; i++){printf("%d ", *((*p) + i));}return 0;
}

//一维数组传参,形参是数组
void print(int arr[10], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
//一维数组传参,形参是指针
void print(int *arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){//printf("%d ", arr[i]);printf("%d ", *(arr+i));}printf("\n");
}
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;
}

void print(int arr[3][5], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){printf("%d ",arr[i][j]);}printf("\n");}
}void print(int(*arr)[5], int r, int c)
{int i = 0;for (i = 0; i < r; i++){int j = 0;for (j = 0; j < c; j++){printf("%d ", *(*(arr + i) + j));//arr[i]}printf("\n");}
}
int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };//二维数组的数组名,也表示首元素地址//二维数组的首元素是第一行//首元素的地址就是第一行的地址,是一个一维数组的地址print(arr, 3, 5);return 0;
}

🥰希望大家能够理解呀🥰
总结🥰
以上就是 指针的进阶【上篇】 内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
欲知后事如何,请听下篇分解喽💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰
相关文章:
指针的进阶【上篇】
文章目录📀1.字符指针📀2.指针数组📀3.数组指针💿3.1.数组指针的定义💿3.2. &数组名VS数组名💿3.3.数组指针的使用📀1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...
MATLAB | 如何用MATLAB绘制花里胡哨的山脊图
本期推送教大家如何绘制各种样式的山脊图,这里做了一个工具函数用来实现好看的山脊图的绘制,编写不易请多多点赞,大体绘制效果如下: 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中,…...
.Net与程序集
一个简单的C#程序回想一下我们第一个.net 程序 hello world,它具有那些步骤呢?打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来,上面打印着hello world。我们打开文件夹的bin目录,会发现里…...
软考中级之数据库系统(重点)
涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...
界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!
DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐…...
【架构师】零基础到精通——网关策略
博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名退役Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小…...
【java 8】方法引用与构造器引用
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...
SGI 空间配置器
前言 空间配置器是 STL 六大组件之一,它总是隐藏在容器的背后,默默工作,默默付出。本文为《STL 源码剖析》读书笔记,主要讨论 SGI 版本空间的配置和释放,对代码进行解读时会改变一些写法,使其更易于阅读。…...
2023年白酒行业研究报告
第一章 行业概况 白酒是中国传统的酿酒业之一,历史悠久,源远流长。白酒指以高粱等粮谷为主要原料,以大曲、小曲或麸曲及酒母等为糖化发酵剂,经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的,酒精度(体积分数)在18%-68%…...
华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】
合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用空格隔开 如果不存在输出0 示…...
华为OD机试真题Python实现【英文输入法】真题+解题思路+代码(20222023)
英文输入法 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。注意 英文单词联想时区分大小写缩略形式如"don’t&quo…...
改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head
绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…...
LLFlow沦为和代码解读
LLFlow沦为和代码解读 1.测试时代码的运行位置 sr:什么意思 sr 和 z 这里又将模型设置为了训练模式 所以下面这部分代码应该是测试时运行的所有代码 这个就是测试时使用的网络模型框架 下面应该就是self.netG的网络模型框架 但是这个z的网络模型框架代码还不…...
C语言学习及复习笔记-【9】数组
目录9. 数组9.1 数组的定义9.2 数组与指针的区别9.3 数组大小计算9.4 数组的赋值9.5多维数组寻址方式9.6 函数数组9. 数组 9.1 数组的定义 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往…...
Kubernetes入门教程 --- 使用kubeadm进行集群安装
Kubernetes入门教程 --- 使用kubeadm和二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.5 时间同步2.6 安装组件2.7 部署集群2.8 Master安装网络插卡3. 查询状态3.1 查询n…...
华为OD机试真题Python实现【相对开音节】真题+解题思路+代码(20222023)
相对开音节 题目 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外) 常见的单词有bike cake 给定一个字符串,以空格为分隔符 反转每个单词的字母 若单词中包含如数字等其他非字母时不进行反转 反转后计算其中含有相对开音节结构的子串个数 (连续子串中部分字符可以重复) …...
海思SD3403/SS928V100开发(5)MIPI_YUV相机vio sample开发----修改思路
1. 前言 sensor输出格式: YUV422 8bit 硬件连接: MIPI_YUV相机(4lane MIPI) -> SS928V100 MIPI0(4lane) 框图: 2. 几个问题 基于SS928 SDK中的 vio sample修改; 但是sample里面都是基于RAW RGB sensor开发的sample, 没有现成的MIPI_YUV sensor的参考,需要自己…...
javaee之node.js与es6
问题1:在IDEA控制台为什么node显示不会出来命令 修改完之后记得重新启动电脑 问题2:response.end()作用 在Web开发中,浏览器端的请求到达服务器进行处理的时候,Response.End的作用就是让request执行到此结束,输出到客户…...
11 nacos源码开篇
nacos核心功能点: 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存…...
13.Jenkins集成sonarqube
Jenkins集成sonarqube1.jenkins集成sonarqube2.jenkins以maven的方式集成sonarqube scanner报错1报错21.jenkins集成sonarqube 1.在jenkins插件管理中安装sonarqube scanner 2.jenkins要知道sonarqube服务端是谁,需要配置(系统管理–系统配置–sonarq…...
融合gws-PINNs与马尔可夫切换模型:反演跳跃系数PDE的混合框架
1. 项目概述与核心挑战在科学计算和工程建模领域,我们经常遇到一个“反着来”的难题:已知一个物理系统的观测数据(比如某个区域随时间变化的温度场、流速场),也知道描述这个系统的大致物理规律(比如热传导方…...
topcode【随机算法题】【2026.5.24打卡-java版本】
最长有效括号 要点:栈,push下标 class Solution {public int longestValidParentheses(String s) {//栈//放前哨-1Deque<Integer> stack new ArrayDeque<>();stack.push(-1);int ans 0;for(int i 0; i < s.length(); i){char c s.…...
别再折腾VMware Tools了!用FileZilla+SSH搞定Windows与Ubuntu虚拟机文件互传(保姆级教程)
告别VMware Tools烦恼:SSHFileZilla实现跨平台文件传输全攻略 每次在Windows和Ubuntu虚拟机之间传输文件时,VMware Tools总是给你带来各种麻烦?安装失败、兼容性问题、功能受限...这些问题我都经历过。今天我要分享的是一种更稳定、更通用的…...
git的使用技巧汇总
全局配置 1.查看配置 git config --list 或者 git config user.name 2.保存用户名和邮箱 git config --global user.name “test” git config --global user.email testexample.com 3.换行符设置 git config core.autocrlf true|false|input 由于系统对文件结尾换行&#x…...
第一次给 CANN 社区做贡献?从 community 仓库入手
前言 开源社区是个奇妙的地方。你用着别人免费分享的代码,享受着别人免费提供的文档,突然有一天你想:我是不是也能为这个社区做点贡献? 但紧接着你就被一堆问题拦住了:怎么提 Issue?怎么提 PR?…...
终极AI编舞师:5分钟让音乐自动生成3D舞蹈的完整指南
终极AI编舞师:5分钟让音乐自动生成3D舞蹈的完整指南 【免费下载链接】mint Multi-modal Content Creation Model Training Infrastructure including the FACT model (AI Choreographer) implementation. 项目地址: https://gitcode.com/gh_mirrors/mint20/mint …...
可观测性最佳实践:构建全面的系统监控体系
可观测性最佳实践:构建全面的系统监控体系 一、可观测性最佳实践概述 1.1 可观测性的定义 可观测性是指通过外部输出(指标、日志、追踪)来推断系统内部状态的能力。它帮助运维人员理解系统行为,快速定位问题,优化系统性…...
JMeter深度实战:从HTTP接口测试到性能根因分析
1. 这不是“点点按钮就能出报告”的玩具,而是接口质量的显微镜很多人第一次打开JMeter,以为它就是个带图形界面的curl增强版——填个URL、点下“启动”,等几秒看个响应码,再导出个Excel就完事了。我刚接手电商中台接口测试时也这么…...
FPGA与机器学习协同加速量子点自动调谐:原理、实现与性能分析
1. 项目概述:当FPGA遇上机器学习,量子点调谐的“自动驾驶”时代在量子计算实验室里,调谐一个量子点器件进入单电子态,是每个实验物理学家都绕不开的“苦差事”。这活儿有多磨人?你得坐在仪器前,手动调节两个…...
解决Keil MDK中RL-ARM许可证错误L9937E的方法
1. 问题现象与背景解析最近在维护一个基于Keil MDK的嵌入式老项目时,遇到了一个棘手的许可证错误。项目需要使用RL-ARM实时库(Real-Time Library),但编译时出现了以下错误提示:Error: L9937E: RL-ARM is not allowed w…...
