C语言——指针(四)

📝前言:
上篇文章C语言——指针(三)对指针和数组进行了讲解,今天主要更深入的讲解一下不同类型指针变量的特点
1,字符指针变量
2,数组指针变量
3,函数指针变量

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:想去的地方,敲两次门又何妨


文章目录

    • 一,字符指针变量(char*)
      • 1,一般使用
      • 2,储存字符串
      • 3,面试题
    • 二,数组指针变量
      • 1,识别数组指针
      • 2,数组指针的初始化
      • 3,二维数组传参的本质
    • 三,函数指针变量
      • 1,函数的地址
      • 2,创建函数指针
      • 3,函数指针的使用

一,字符指针变量(char*)

1,一般使用

👇🏻

int main()
{char ch  = 'a';char *pc = &ch; //把ch的地址赋值给pc*pc = 'a';     //把‘a’赋值给pc所指向的空间return 0}

2,储存字符串

那么字符串又该如何用字符指针来储存呢?
请看下面的代码👇🏻:

int main()
{const char* pc = "hello bit";printf("%s\n", pc);return 0;
}

对于第一行代码:const char* pc = “hello bit”;
难道这里是把整个字符串储存到pc指针变量里了吗?

答案是:错误!

真正存入pc指针变量的是“hello bit”的第一个字符‘h’的地址
这是因为:
当常量字符串出现在表达式中的时候,它的值是第一个字符的地址

我们都知道数组中**首地址[下标]**的形式可以实现对元素的查找,其实字符串也可以用同样的形式来查找字符串中的内容。

因为:字符串在内存中也是连续储存的,所以,我们可以把字符串理解成:一个内容不能被修改的字符数组
并且**表达式中的整个字符串的值是第一个字符的地址!!!**

我们可以验证一下👇🏻:
在这里插入图片描述
就如上面图片所展示的,以pc为首地址,找到了下标为0的字符‘h’和下标为3的字符‘l’

3,面试题

下面有一道典型的题目,可以加深我们的理解:
请看下面这段代码👇🏻,思考输出结果

int main()
{char str1[] = "hello bit.";char str2[] = "hello bit.";const char* str3 = "hello bit.";const char* str4 = "hello bit.";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;
}

结果是👇🏻
在这里插入图片描述

解释(逐步分析):
对变量进行理解:
1,这里的str1和str2是两个不同的字符数组,但是存放的内容都是:“hello bit.”
2,str3和str4是两个字符变量,表达式中的“hello bit”的值是首字符的地址,所以str3和str4中存放的都是‘h’的地址
对表达式的意义进行理解:
1,**if(str1 == str2)**中,str1代表的是str1数组中首元素的地址,str2代表的是str2数组中首元素的地址,所以,这个表达式比较的是两个数组首元素的地址是否相同
2,**if(str3 == str4)**中,因为str3和str4都是字符指针,是两个变量,所以,这个表达式比较的是两个变量里面的值是否相同
虽然,str1与str2两个字符数组的内容相同,但是两个字符数组所占用的内存是不同的,所以两个数组的首元素的地址也不同,所以str1!=str2
对于str3和str4而言,两个变量储存的都是同一份“hello bit”中’h’的地址,所以两个变量的内容是相同的,即:str3==str4

二,数组指针变量

1,识别数组指针

数组指针变量就是用来存放数组的地址,能够指向数组的指针变量
我们来看下面哪个是数组指针(注意看类型):

int *p1[10];
int (*p2)[10]

答案:
p1是:数组里有十个元素,每个元素的类型是int*的指针数组
p2是:指向数组,这个数组有十个元素,每个元素的类型是int的数组指针

解释:
在这里我们要注意符号结合的优先级:[]的优先级高于*号
1)p1先与[10]结合→构成一个有10个元素的数组,数组的类型为int*
2)p2在()的限制下,先与*号结合构成指针,指向的是有十个元素的数组,数组的类型是int

下图是数组指针类型的解析:
在这里插入图片描述

2,数组指针的初始化

和其他类型的变量初始化相似,只需给变量赋一个符合类型的值就行了
例如👇🏻,我们用&来得到数组的地址,然后再赋值给数组指针:

int arr[10] = {0};
int(*p)[10] = &arr;
//这样我们就通过&arr得到了数组的地址,然后复制给了p指针变量

3,二维数组传参的本质

趁热打铁:学习了数组指针,我们再来看看与其有关的二维数组的传参本质
我们都知道:
1,二维数组可以看成每个元素是一维数组的数组,那么→二维数组的每一行其实就是一个元素(且这个元素是一维数组)
2,数组名是数组首元素的地址,那么→二维数组的数组名也就是二维数组的第一行这个一维数组的地址
从上面我们可以推断:
二维数组传参的本质是:传递这个二维数组的第一行这个一维数组的地址
所以,二维数组传参的时候,也可以用数组指针的形式来书写

void test(int arr[3][5]) == void test(int (p)[5])
//这个变量p就是数组指针,存放的是这个二维数组里第一行一维数组的地址,类型是int(
)[5]

三,函数指针变量

函数指针变量就是用来存放函数的地址的指针变量
有了函数的地址以后,我们就可以通过地址来调用函数

1,函数的地址

函数有没有地址?函数的地址又该怎么拿到呢?
我们做个测试👇🏻
在这里插入图片描述
我们发现:1,函数也是有地址的,可以用 &函数名 来获得,2,函数名表示的是函数的地址

2,创建函数指针

函数指针的写法与数组指针类似,下面进行函数指针创建的展示👇🏻

void test()
{printf(“天天开心”);
}
void(*pf1)()= &test; //pf1存放的就是test函数的地址
int Add(int x, int y)
{return x+y;
}
int (*pf3)(int, int ) = &Add; //pf3存放的就是Add函数的地址
(或者) == int (*pf3)(int x, int y ) = &Add;

函数指针类型解析👇🏻:
在这里插入图片描述

3,函数指针的使用

通过函数指针调用指针指向的函数👇🏻

int main()
{int(*pf3)(int, int) = Add;printf("%d\n", (*pf3)(2, 3));printf("%d\n", pf3(2, 3));return 0;
}

输出结果:
5
8


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问A…

2022年8月2日 Go生态洞察:Go 1.19版本发布深度解析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

6-63.圆类的定义与使用(拷贝构造函数)

本题要求完成一个圆类的定义,设计适当的函数:包括构造函数、拷贝构造函数以及析构函数,从而可以通过测试程序输出样例 在这里给出一组输入。例如: 5 输出样例: 在这里给出相应的输出。例如: Constructo…

本项目基于Spring boot的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ

在业务逻辑的异步处理,系统解耦,分布式通信以及控制高并发的场景下,消息队列有着广泛的应用。本项目基于Spring的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ添加和读取消息的功能。并比较了两种模式&…

osg LOD节点动态调度

1、LOD节点 LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中&…

mongoose学习记录

mongoose安装和连接数据库 npm i mongoose导入mongoose const mongoose require(mongoose) mongoose.set("strictQuery",true)连接数据库 mongoose.connect(mongodb:127.0.0.1:27017/test)设置回调 mongoose.connection.on(open,()>{console.log("连接成…

规则引擎专题---3、Drools组成和入门

Drools概述 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启…

numpy实现神经网络

numpy实现神经网络 首先讲述的是神经网络的参数初始化与训练步骤 随机初始化 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始…

手写VUE后台管理系统7 - 整合Less样式

整合LESS 安装使用 Less(Leaner Style Sheets),是一门向后兼容的 CSS 扩展语言。 Less 官网:https://less.bootcss.com/ 安装 yarn add less安装完成就可以直接使用了 使用 以文件形式定义全局样式 在 assets 目录下创建 less …

基于卷积神经网络的肺炎影像分类分割智能诊断系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 肺炎是一种常见的呼吸系统感染疾病,其主要病因包括细菌、病毒和真菌等。肺炎的早期诊断对于患者的治疗和预后至关重要。传统的肺炎诊断方…

打造个性化github主页 一

文章目录 概述创建仓库静态美化GitHub 统计信息卡仓库 GitHub 额外图钉仓库 热门语言卡仓库 GitHub 资料奖杯仓库 GitHub 活动统计图仓库 打字特效添加中文网站统计仓库 总结 概述 github作为全球最大的代码托管平台,作为程序员都多多少少,都使用过他。…

【排序】直接插入排序和希尔排序

目录 一、排序思想 1、直接插入排序 2、希尔排序 二、代码实现 三、性能比较 四、排序总结 1、直接插入排序 2、希尔排序 一、排序思想 1、直接插入排序 基本思想:把待排序的序列选取一个整数逐个插入到已经排好的有序序列中,直到所有整数都插入…

智加科技获全国首张重卡无人驾驶开放道路测试牌照

2023年12月1日,智加科技获得苏州市智能网联汽车无人化测试牌照。该牌照也是江苏省及国内首张无人重卡开放高速公路全路段全场景全息路网(S17苏台高速)道路测试牌照。 该重卡无人驾驶开放道路测试牌照,经由苏州市智能网联汽车联席小…

图书整理II(两个栈实现队列)

目录 贼相似题目: 本题题目: 我们直接看题解吧: 审题目事例提示: 解题分析: 解题思路: 代码实现: 代码补充说明: 力扣题目地址: LCR 125. 图书整理 II - 力扣&#xff0…

基于深度学习面向中医诊断的舌象图像分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 中医舌诊是通过观察舌的各种特征来了解人体的健康状况,从而对各种疾病做出诊断及病情评估,是传统中国医学应用最广、最有价值的诊法之一。…

如何在没有备份的情况下从 Android 手机恢复已删除的数据

电话数据对我们至关重要。我们可以更换我们使用的设备,但不能更换我们的数据。我们以前一直使用CD、USB 和硬盘来保存数据。随着技术的出现,我们遇到了云存储。我们可以随时随地、任意次数地访问存储。所有操作系统都有数据云,可以用来保存图…

docker容器内部文件挂载主机

docker images执行该命令可以发现一个centos镜像 docker run --namemycentos -itd --privilegedtrue --restartalways -p 88:80 -v C:\Users\Administrator\Desktop\dockerTest:/bin/gh:ro centosdocker run 命令用于在 Docker 上创建和运行容器。 --namemycentos 指定容器…

【面试HOT200】回溯篇

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于【CodeTopHot300】进行的,每个知识点的修正和深入主要参…

PAD平板签约投屏软件要如何选

又是一年年底了,年会开始多起来了,许多会务公司或活动公司会接到很多平板签约投屏业务,如年会中的签军令状、业绩保证书等。这时就面临选购一套签约投屏软件了。 目前的签约投屏软件,大多以H5做的网页版的多,但我建议…

Web安全漏洞分析-XSS(中)

随着互联网的迅猛发展,Web应用的普及程度也愈发广泛。然而,随之而来的是各种安全威胁的不断涌现,其中最为常见而危险的之一就是跨站脚本攻击(Cross-Site Scripting,简称XSS)。XSS攻击一直以来都是Web安全领…