当前位置: 首页 > news >正文

指针的进阶【上篇】

文章目录

  • 📀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们多多支持哦🥰🥰🥰

请添加图片描述

相关文章:

指针的进阶【上篇】

文章目录&#x1f4c0;1.字符指针&#x1f4c0;2.指针数组&#x1f4c0;3.数组指针&#x1f4bf;3.1.数组指针的定义&#x1f4bf;3.2. &数组名VS数组名&#x1f4bf;3.3.数组指针的使用&#x1f4c0;1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

本期推送教大家如何绘制各种样式的山脊图&#xff0c;这里做了一个工具函数用来实现好看的山脊图的绘制&#xff0c;编写不易请多多点赞&#xff0c;大体绘制效果如下&#xff1a; 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中&#xff0c;…...

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world&#xff0c;它具有那些步骤呢&#xff1f;打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来&#xff0c;上面打印着hello world。我们打开文件夹的bin目录&#xff0c;会发现里…...

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…...

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…...

【java 8】方法引用与构造器引用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一&#xff0c;它总是隐藏在容器的背后&#xff0c;默默工作&#xff0c;默默付出。本文为《STL 源码剖析》读书笔记&#xff0c;主要讨论 SGI 版本空间的配置和释放&#xff0c;对代码进行解读时会改变一些写法&#xff0c;使其更易于阅读。…...

2023年白酒行业研究报告

第一章 行业概况 白酒是中国传统的酿酒业之一&#xff0c;历史悠久&#xff0c;源远流长。白酒指以高粱等粮谷为主要原料&#xff0c;以大曲、小曲或麸曲及酒母等为糖化发酵剂&#xff0c;经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的&#xff0c;酒精度(体积分数)在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&#xff1a;什么意思 sr 和 z 这里又将模型设置为了训练模式 所以下面这部分代码应该是测试时运行的所有代码 这个就是测试时使用的网络模型框架 下面应该就是self.netG的网络模型框架 但是这个z的网络模型框架代码还不…...

C语言学习及复习笔记-【9】数组

目录9. 数组9.1 数组的定义9.2 数组与指针的区别9.3 数组大小计算9.4 数组的赋值9.5多维数组寻址方式9.6 函数数组9. 数组 9.1 数组的定义 C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往…...

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&#xff1a;在IDEA控制台为什么node显示不会出来命令 修改完之后记得重新启动电脑 问题2&#xff1a;response.end()作用 在Web开发中&#xff0c;浏览器端的请求到达服务器进行处理的时候&#xff0c;Response.End的作用就是让request执行到此结束&#xff0c;输出到客户…...

11 nacos源码开篇

nacos核心功能点&#xff1a; 服务注册&#xff1a;Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务&#xff0c;提供自身的元数据&#xff0c;比如ip地址、端口等信息。Nacos Server接收到注册请求后&#xff0c;就会把这些元数据信息存储在一个双层的内存…...

13.Jenkins集成sonarqube

Jenkins集成sonarqube1.jenkins集成sonarqube2.jenkins以maven的方式集成sonarqube scanner报错1报错21.jenkins集成sonarqube 1.在jenkins插件管理中安装sonarqube scanner 2.jenkins要知道sonarqube服务端是谁&#xff0c;需要配置&#xff08;系统管理–系统配置–sonarq…...

2026届毕业生推荐的五大AI科研神器实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在运用人工智能辅助写作这个行为当中&#xff0c;所生成的内容常常带有十分明显的机械感。所…...

Agent在财务场景有哪些核心应用?深度解析2026企业智能化转型路径

站在2026年的技术节点回望&#xff0c;财务部门早已从传统的“记账中心”转型为企业的“战略决策大脑”。AI Agent&#xff08;人工智能助手/智能体&#xff09;的爆发式应用&#xff0c;彻底终结了繁琐的表单时代。与2024年的实验性尝试不同&#xff0c;当下的财务Agent具备了…...

Muon最佳实践:10个提升开发效率的实用技巧

Muon最佳实践&#xff1a;10个提升开发效率的实用技巧 【免费下载链接】muon GPU based Electron on a diet 项目地址: https://gitcode.com/gh_mirrors/mu/muon Muon作为一款基于GPU的轻量级Electron替代方案&#xff0c;采用Golang开发并使用Ultralight引擎&#xff0…...

OpenMS实战指南:如何用开源工具解决质谱数据分析三大难题

OpenMS实战指南&#xff1a;如何用开源工具解决质谱数据分析三大难题 【免费下载链接】OpenMS The codebase of the OpenMS project 项目地址: https://gitcode.com/gh_mirrors/op/OpenMS 你是否正在为复杂的质谱数据分析而烦恼&#xff1f;面对海量的LC-MS数据&#xf…...

用STC32G的HSPWM做个数控电源:从BUCK电路到PID调参,我的DIY踩坑全记录

从零打造STC32G数控电源&#xff1a;我的BUCK电路实战与PID调参血泪史 作为一个常年泡在电子实验室的硬件爱好者&#xff0c;开关电源一直是我又爱又恨的领域。去年冬天&#xff0c;当我第N次烧毁某宝买的降压模块后&#xff0c;终于下定决心自己打造一台高精度数控电源。这次…...

kill-doc文档自动化下载技术实现深度解析与实战指南

kill-doc文档自动化下载技术实现深度解析与实战指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就是为了解决您的烦恼而…...

Pixel Couplet Gen实操手册:像素春联生成结果自动同步至微信公众号图文素材库

Pixel Couplet Gen实操手册&#xff1a;像素春联生成结果自动同步至微信公众号图文素材库 1. 项目介绍与核心功能 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成工具。通过ModelScope大模型的文本生成能力&#xff0c;结合精心设计的8-bit复古游戏…...

AI转PSD终极指南:如何将Illustrator矢量完美导入Photoshop

AI转PSD终极指南&#xff1a;如何将Illustrator矢量完美导入Photoshop 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 还在为设计软件之间的格…...

千问3.5-2B在内容审核中的应用:自动识别敏感图文组合,降低人工复核成本

千问3.5-2B在内容审核中的应用&#xff1a;自动识别敏感图文组合&#xff0c;降低人工复核成本 1. 内容审核的挑战与机遇 每天&#xff0c;互联网上产生数以亿计的图文内容&#xff0c;如何高效识别其中的敏感信息成为平台运营者的重大挑战。传统人工审核方式面临三大痛点&am…...

AI 模型训练中的梯度裁剪技巧

AI模型训练中的梯度裁剪技巧 在深度学习的模型训练过程中&#xff0c;梯度爆炸是一个常见的问题&#xff0c;它会导致模型参数更新过大&#xff0c;进而使训练过程变得不稳定甚至无法收敛。为了解决这一问题&#xff0c;梯度裁剪&#xff08;Gradient Clipping&#xff09;技术…...