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

指针进阶详解---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 引擎&#xf…...

openssl 命令行国密sm2的签名验签操作

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】: 密码学实践强化训练–【目录】 👈👈👈 生成EC私钥: openssl ecp…...

开源代码分享(9)—面向100%清洁能源的发输电系统扩展规划(附matlab代码)

1.背景介绍 1.1摘要 本文提出了一种新颖的建模框架和基于分解的解决策略,将随机规划(SP)和鲁棒优化(RO)相结合,以应对协调中长期电力系统规划中的多重不确定性。从独立系统运营商(ISO&#xff…...

为 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…...

极速净化Windows 11:Win11Debloat一键释放系统潜能

极速净化Windows 11&#xff1a;Win11Debloat一键释放系统潜能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and custo…...

Unity碰撞器性能优化:从幽灵Collider到物理契约治理

1. 为什么一个“看不见”的碰撞器&#xff0c;能让60帧的游戏掉到20帧&#xff1f;在Unity项目上线前的性能压测阶段&#xff0c;我接手过一个看似普通的横版跳跃游戏——美术资源干净&#xff0c;逻辑简单&#xff0c;主角只有3个动画状态&#xff0c;连粒子特效都控制在5个以…...

2026年PCB行业研究报告

随着全球算力需求爆发式增长&#xff0c;印制电路板&#xff08;PCB&#xff09;已从传统的电子连接载体&#xff0c;演进为决定AI集群信号完整性的核心物理瓶颈。PCB不仅是电子工业的母板&#xff0c;更是支撑人工智能与大数据等新质生产力落地的底层基石。当前&#xff0c;行…...

今天不学这5个专业级Refinement技巧,你的ChatGPT文章永远过不了主编终审关

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Refinement技巧在ChatGPT内容生产中的战略价值 Refinement&#xff08;精炼&#xff09;并非简单的二次润色&#xff0c;而是以目标导向的迭代式提示工程策略——它通过结构化反馈、上下文锚定与语义约束&…...

从微积分到级数:一张图看懂考研数学六大章节的核心逻辑与联系

从微积分到级数&#xff1a;一张图看懂考研数学六大章节的核心逻辑与联系 考研数学的复习常常让人感到知识点零散、难以串联。许多考生在反复刷题后&#xff0c;依然无法建立起完整的知识框架。本文将通过一张思维导图&#xff0c;揭示从一元函数微积分到无穷级数之间的内在联系…...

TSC打印机Java开发避坑指南:从DLL配置到中文乱码,一次讲清楚

TSC打印机Java开发避坑指南&#xff1a;从DLL配置到中文乱码&#xff0c;一次讲清楚 第一次用Java调用TSC打印机时&#xff0c;那种挫败感至今难忘。明明照着官方文档一步步操作&#xff0c;却总是卡在DLL加载失败、中文变成乱码这些看似简单的问题上。这篇文章就是把我踩过的坑…...

LEO卫星自愈网络:动态抗干扰与信号合并算法实践

1. 项目概述&#xff1a;LEO卫星自愈网络的设计挑战与创新方案在近地轨道&#xff08;LEO&#xff09;卫星通信领域&#xff0c;我们正面临着一个关键的技术矛盾&#xff1a;一方面&#xff0c;LEO卫星凭借其低延迟特性成为下一代全球通信网络的核心组成部分&#xff1b;另一方…...

开源fNIRS脑机接口帽技术解析与应用

1. 开源可穿戴fNIRS脑机接口帽技术解析在神经工程领域&#xff0c;功能性近红外光谱&#xff08;fNIRS&#xff09;技术正逐渐成为研究大脑活动的重要工具。与传统的脑电图&#xff08;EEG&#xff09;或功能磁共振成像&#xff08;fMRI&#xff09;相比&#xff0c;fNIRS具有独…...

BarrageGrab:构建企业级直播弹幕实时采集系统的技术架构与实践指南

BarrageGrab&#xff1a;构建企业级直播弹幕实时采集系统的技术架构与实践指南 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连&#xff0c;非系统代理方式&#xff0c;无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在直…...

用RT-Thread硬件定时器实现精准任务调度:一个LED呼吸灯与数据采集的案例

用RT-Thread硬件定时器实现精准任务调度&#xff1a;一个LED呼吸灯与数据采集的案例 在嵌入式开发中&#xff0c;任务调度和时间管理是核心挑战之一。RT-Thread作为一款优秀的实时操作系统&#xff0c;其硬件定时器&#xff08;HWTIMER&#xff09;功能为开发者提供了高精度的时…...