指针进阶详解---C语言

❤博主CSDN:啊苏要学习
▶专栏分类:C语言◀
C语言的学习,是为我们今后学习其它语言打好基础,C生万物!
开始我们的C语言之旅吧!✈
目录
前言:
一.字符指针
二.指针数组
三.数组指针
四.数组、指针参数
4.1一维数组传参
编辑4.2二维数组传参
编辑4.3一级指针传参
4.4二级指针传参
五.函数指针
六.类型重定义
前言:
“爷爷,爷爷!你关注的啊苏博主终于更新啦!”,博主六月中旬在忙期末复习,七月在搞军训,兜兜转转,落下了两个月。
现在要快马加鞭学习总结知识啦!今天总结的知识是指针进阶,干货满满,希望大家喜欢。
一.字符指针
在指针初阶的文章里面,我们已经初步认识指针是存放地址的变量,然后通过解引用操作,可以找到对应空间里的值。
字符指针是存放字符变量地址的变量,比如:

我们知道对字符数组有两种初始化方式,请看:

arr1数组名本质是首字符'h'的地址,那么同为字符数组的arr2,也应该表示首元素的地址,这样得出一个结论:
字符串"helloworld"实际上表示'h'的地址;
既然字符串是字符的地址,那就可以用字符指针管理字符串:

讲到这里,大家对字符指针有更进一步的认识了,接下来补充一个点:

改变数组的首字符'h'是没问题的,改变字符指针的就出问题了,原因是:
数组通过字符串的形式初始化,数组里的内容可以改,而字符指针管理的字符串,是一个常量字符串,不能被修改。
二.指针数组
指针数组,存放指针的数组。我们使用指针数组来模拟实现一下二维数组:
int main()
{int arr1[] = {1,2,3,4,5};int arr2[] = {6,7,8,9,10};int arr3[] = {11,12,13,14,15};//arr1、arr2、arr3是1 6 11的地址//整型的地址要放到整型指针中int* arr[] = {arr1, arr2, arr3};return 0;
}
arr有三个元素,每一个元素是一个一维数组的起始地址。arr[0]是第一个元素,相当于arr1。
假如我们要访问arr1中5个元素,我们可以直接用arr1[i],i从0—4增长;也可以像二维数组arr[0][i]这样访问。
学习指针数组,让我们对指针和数组的关系更加清晰,这里希望读者能明白什么是指针数组,简而言之就是存放指针的数组。
三.数组指针
数组指针是指向数组的指针,这个指针存放的是数组的地址。大家先分析两句代码分别是什么意思:
int main()
{int *pa[10];int(*pa)[10];return 0;
}
第一句代码:int * pa[10]是一个指针数组,pa先和[10]结合,pa是一个数组,数组的每个元素是int*。
第二句代码:int(*pa)[10]是一个数组指针,pa和*括起来,先成为一个指针,指向int[10]这个存放十个整型的数组。
我们先来看一个代码:

这种方式非常麻烦,直接用arr就可以了,根本不需要把数组的地址给数组指针,解引用找到数组,数组再解引用找到数据。
一句话,上面是脱裤子放屁。数组指针用在二维数组里:


总结:二维数组的数组名是一维数组的地址,解引用一层,得到一维数组的数组名,是数据的地址,再解引用一层,得到数据。
四.数组、指针参数
在使用库函数或者是自定义函数时,常常需要传递实参,形参要接收。
不论是给了实参写形参,还是根据形参写实参,都需要遵循类型匹配的原则,这样才不会出错。
4.1一维数组传参
4.2二维数组传参
4.3一级指针传参

4.4二级指针传参

五.函数指针
函数在调用的时候,也会开辟栈空间,相应的也会有地址,那么存放函数地址的指针就叫做函数指针。

不难看出,pf是一个指向Add函数的指针,解引用的*实际上是摆设,可以不加,但是如果加上,一定要括号括起来(*pf)。
否则,执行的逻辑就是,pf(3,5)调用返回8这个值,然后对8解引用,这是错误的。
接下来看看这两个代码分别表示什么意思:
(* (void(*)()) 0)();
这句代码是什么意思呢?咋一看,跟没看差不多,完全不知所语,博主一开始也是一样~
0本来是一个整型,使用C语言中的强制类型转换,把0转换为一个函数的地址,这个函数没有参数、没有返回值。
然后使用解引用的方式调用这个函数,所以这句代码的本质是一次调用以0为地址处的函数。
void(*signal(int, void(*)(int)))(int);
这句代码的本质是一句函数声明,我们来分析一下:
signal先和括号结合,说明是一个函数,参数是int,和以int为参数,返回类型为空的函数指针;
去掉函数名和参数部分,剩下的就是函数的返回类型,也是一个函数指针。
相信读者已经懂为什么这是一个函数声明的原因了,我们想了想,这种代码可读性那么差,真实不方便!于是:
六.类型重定义
在初始C语言中,typdef能将类型重新定义,以至于不会让代码看起来冗长,难以理解,函数指针也是类型,也可以重定义。
int main()
{typdef unsigned int u_int;typdef int* ptr_t;//数组指针类型这样重定义可行吗?typdef int(*)[10] parr_t;typdef int(*)(int, int) pf_t;//更改typdef int(*parr_t)[10];typdef int(*pf_t)(int, int);return 0;
}
前面我们创建一个数组指针和函数指针的书写的时候,先是(),里面放*和一个变量名确保变量是一个指针。
在类型重定义的时候也是一样,要把重新定义的名字放在(*)里面,更改后的写法才是正确的。这样再对前面第二段代码进行简化。
int main()
{//重定义参数为int,返回类型为空的函数指针类型typdef void(*pf_t)(int);void(*signal(int, void(*)(int)))(int);//简化pf_t signal(int, pf_t);return 0;
}
简化后是多么令人心情愉悦啊。
好的,这篇文章内容也差不多了,还有一部分的讲解我们留给下一篇,如果你喜欢,可以留个大拇指噢~
结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔
读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!
❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。
相关文章:
指针进阶详解---C语言
❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打好基础,C生万物! 开始我们的C语言之旅吧!✈ 目录 前言: 一.字符指针 二.指针数组 三.数组指针 四.数组、指针参数 …...
设计模式思考,简单工厂模式和策略模式的区别?
最近学习了设计模式,学到简单工厂模式和策略模式的时候想,这两个模式不是一样嘛,仔细思考之后发现大体设计思路是一样的,但是细节却有所不一样。 简单工厂模式 简单工厂模式是一种创建型设计模式,它主要涉及对象的创建…...
Java - sh 脚本启动 jar 包等服务 - sh 脚本模板 - 适用于任何类似的服务启动
sh 脚本模板 该模板,每次运行一次都会 kill 掉原来的服务,然后重新启动 jar 包服务 #!/bin/bash# 定义Java进程的名称 APP_NAMEyour-app-name.jar# 定义Java进程的日志文件路径 LOG_PATH/var/log/your-app-name.log# 定义备份日志文件的目录 BACKUP_DI…...
MySQL高级篇第5章(存储引擎)
文章目录 1、查看存储引擎2、设置系统默认的存储引擎3、设置表的存储引擎3.1 创建表时指定存储引擎3.2 修改表的存储引擎 4、引擎介绍4.1 InnoDB 引擎:具备外键支持功能的事务存储引擎4.2 MyISAM 引擎:主要的非事务处理存储引擎4.3 Archive 引擎…...
openssl 命令行国密sm2的签名验签操作
快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】: 密码学实践强化训练–【目录】 👈👈👈 生成EC私钥: openssl ecp…...
开源代码分享(9)—面向100%清洁能源的发输电系统扩展规划(附matlab代码)
1.背景介绍 1.1摘要 本文提出了一种新颖的建模框架和基于分解的解决策略,将随机规划(SP)和鲁棒优化(RO)相结合,以应对协调中长期电力系统规划中的多重不确定性。从独立系统运营商(ISOÿ…...
为 Google Play 即将推出基于区块链的内容政策做好准备
作者 / Joseph Mills, Group Product Manager, Google Play 作为一个平台,Google Play 一直致力于帮助开发者将创新理念变为现实。Google Play 上托管了许多和区块链相关的应用,我们深知合作伙伴们希望扩展这些应用,并利用 NFT 等代币化数字资…...
查找-多路查找详解篇
多路查找树 多路查找树(Multway Search Tree)是一种高级的树形数据结构,它 允许每个节点有多个子节点(通常大于等于2)。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树(2-3 Tree&#x…...
css设置八等分圆
现需要上图样式的布局,我通过两张向右方的图片,通过定位和旋转完成了布局。 问题: 由于是通过旋转获取到的样式,实际的盒子是一个长方形,当鼠标移入对应的箭头时选中的可能是其他盒子,如第一张设计稿可以看…...
「教程」如何使用一套代码在多种程序中接入天气预警API
引言 天气预警的重要性不言而喻,在遭受自然灾害和极端天气时,及时获得预警信息可以拯救生命和减少财产损失。如今,随着科技的进步,开发者和企业可以借助天气预警 API 这款强大的服务,将实时预警信息集成到自己的应用中…...
(MYSQL)数据库服务端的启动与停止,登录与退出
MYSQL服务的启动与停止 方式一:右击左下角win图标——选择计算机管理——选择计算机管理(本地)——选择服务和应用程序——找到mysql(此方法不好用) 方式二:通过管理员身份运行(必须是管理员身…...
数学建模学习(8):单目标和多目标规划
优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…...
【Vscode | R | Win】R Markdown转html记录-Win
Rmd文件转html R语言环境Vscode扩展安装及配置配置radian R依赖包pandoc安装配置pandoc环境变量验证是否有效转rmd为html 注意本文代码块均为R语言代码,在R语言环境下执行即可 R语言环境 官网中去下载R语言安装包以及R-tool 可自行搜寻教程 无需下载Rstudio Vscod…...
【Lua语法】字符串操作、字符串中的方法
1.对字符串的操作 --声明一个字符串 str "我是一个字符串"--1.获取字符串的长度 -- 前面加个#即可(注意:Lua中字母占1个长度,汉字占3个长度) print(#str)--2.字符串多行打印 -- 方法1.Lua中是支持转义字符的 print("哈哈\n嘻嘻&q…...
Linux 终端生成二维码
1、安装qrencode [rootnode1 script]# yum -y install qrencode2、输出正常的 [rootnode1 ~]# echo https://www.github.com|qrencode -o - -t utf83、输出彩色的 [rootnode1 ~]# qrencode -t utf8 -s 1 https://www.github.com|lolcatPS:没有lolcat命令 #由于…...
子组件未抛出事件 父组件如何通过$refs监听子组件中数据的变化
我们平时开发项目会使用一些比较成熟的组件库, 但是在极小的情况下,可能会出现我们需要监听某个属性的变化,使我们的页面根据这个属性发生一些改变,但是偏偏组件库没有把这个属性抛出来,当我们使用watch通过refs监听时,由于生命周期的原因还不能拿到,这时候我们可以这样做,以下…...
【C++】STL——stack的介绍和使用、stack的push和pop函数介绍和使用、stack的其他成员函数
文章目录 1.stack的介绍2.stack的使用2.1stack构造函数2.1stack成员函数(1)empty() 检测stack是否为空(2)size() 返回stack中元素的个数(3)top() 返回栈顶元素的引用(4)push() 将元素…...
基于BIM+AI的建筑能源优化模型【神经网络】
推荐:用 NSDT设计器 快速搭建可编程3D场景。 AEC(建筑、工程、施工)行业的BIM 技术,允许在实际施工开始之前虚拟地建造建筑物; 这带来了许多有形和无形的好处:减少成本超支、更有效的协调、增强决策权等等。…...
#P0998. [NOIP2007普及组] 守望者的逃离
题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 题目描述 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛…...
vue3+ts+elementui-plus二次封装弹框
一、弹框组件BaseDialog <template><div classmain><el-dialog v-model"visible" :title"title" :width"dialogWidth" :before-close"handleClose"><!-- 内容插槽 --><slot></slot><template…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
