首页 > 其他分享 >C语言深入理解指针笔记(3)

C语言深入理解指针笔记(3)

时间:2024-10-20 19:46:14浏览次数:3  
标签:变量 函数 笔记 C语言 地址 数组 函数指针 指针

1.字符指针变量

	我们已经了解 的指针变量类型有:整形指针变量:int * pint :存放的是 整型变量的地址 浮点型指针变量:float * pf :存放的是浮点型变量的地址 类比可知:char* pc :  字符型指针变量:存放的是字符型变量的地址,指向字符型的数据
	 首先,字符型指针变量的使用有两种方法:
	 第一种:正常地使用

在这里插入图片描述
即是将一个字符的地址交给字符指针变量来封存
第二种:

在这里插入图片描述
本质上是把字符串“hello bit”的首字符的地址放到字符指针变量pstr中去,而不是把字符串放到字符指针变量中去
我们再看下面的代码:

在这里插入图片描述

	当我们运行会得到:

在这里插入图片描述
其实,这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量字符串存储到单独的⼀个内存区域,当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。

2.数组指针变量

2.1 数组指针变量是什么?

	指针数组是一种数组,存放的是相同类型的地址
	数组**指针变量是一种指针变量,类比字符型指针变量,数组指针变量存放的应该是数组的地址,能够指向数组**
	区别指针数组和数组指针变量:

在这里插入图片描述

	1.int * p1[10]  :p1先和[10]结合,表明表明p1是一个数组名,*表明这个数组存储的是一个地址
	2.int (*p2)[10]:p2先和*结合,表明p2是一个指针变量,指向一个大小为10个整型的数组
	
2.2 数组指针变量这么初始化?
		首先,数组指针变量存放的是数组的指针(地址),那么一个数组的地址怎么取得:

在这里插入图片描述
前面我们在数组名的理解的章节学习了数组名的意义,知道数组名在一般情况下都是数组首元素的地址,但是存在两个特殊的情况:一个是sizeof(数组名),一个是&(数组名),这两种情况下数组名表示的都是整个数组,其中&(数组名)取得的就是一个数组的地址。我们将它赋值给数组指针变量:

在这里插入图片描述

在这里插入图片描述

3.二维数组传参的本质

提及二维数组传参的本质,我们应该想到一维数组传参,我们已经知道了一维数组传参的本质是传递一维数组首元素的地址,类比可知二维数传参也是传递二维数组首元素的地址,**二维数组可以看做是每个元素都是一维数组的数组,二维数组传参的本质即是第一个元素(一维数组)的地址**

在这里插入图片描述
同样,二维数组传参的形参部分也可以写成指针的形式:

在这里插入图片描述

4.函数指针变量

4.1函数指针变量的创建
		类比其它的指针变量,函数指针变量应当是用来存放函数的地址,可以通过函数的地址来访问函数,那么函数是否也存在地址,我们可以尝试打印函数的地址:

在这里插入图片描述
我们发现函数的确有地址,两种方式打印结果都一样:

在这里插入图片描述

	函数指针变量的创建:

在这里插入图片描述
函数指针变量的创建和数组指针变量的创建类似,pf3先和*结合,表明pf3是一个指针变量,指向的是一个函数,该函数的参数类型和数量也在后面表示出来
函数指针类型的解析:

在这里插入图片描述
4.2函数指针变量的使用:

通过函数指针调用指针指向的函数:

在这里插入图片描述
将一个函数的地址存储在函数指针变量pf3中,ps3对ps3解引用得到函数,又因为函数名就是函数的地址,所以pf3和ps3本质上是一样的,都可以表示函数
4.3 typedef关键字
有这样两个有趣的代码:

在这里插入图片描述
实质上是将0强制转化为void()()这种函数指针类型,它的参数个数为0
在这里插入图片描述
这是一句函数声明,signal是一个函数的名字,signal函数有两个参数:一个是int,一个是void(
)(int),signal函数的返回类型也是void(*)(int)这样的函数指针类型。
这样的代码让人眼花缭乱,难以分辨,我们可以使用typedef关键字来类型重命名,简化类型:

在这里插入图片描述
dypedef 可以重命名各种类型,但在重命名指针类型时,新的类型名必须在*右边

5.函数指针数组

	数组是也给存放相同数据类型的存储空间,指针数组是存放相同类型指针的数组,函数指针数组即是存放的指针都是函数的指针的数组:

在这里插入图片描述
parr1先和[3]结合,表明这是一个数组,数组的内容是int (*)()类型的函数指针

6.转移表(函数指针数组的用途)

	计算机的一般实现:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

	使用函数指针数组的实现:

在这里插入图片描述

在这里插入图片描述

标签:变量,函数,笔记,C语言,地址,数组,函数指针,指针
From: https://blog.csdn.net/2401_87277188/article/details/143059056

相关文章

  • 插头 dp / 轮廓线 dp / 连通性 dp 做题笔记
    牢游看见我正在做插头dp,于是给我了一个Claris的连通性dp的pdf。好了,现在又有可以软性颓废的事可干了。好多题目在其他平台都找不到了,这时候我们becoder的优越性就体现出来了!(这就是到处搬题的好处)所以大部分题目链接都会放becoder的链接。什么?你不知道becoder或者没......
  • 【报告】务虚笔记
    务虚笔记同学们大家好,接下来由我向大家推荐史铁生的《务虚笔记》我的报告分为四部分。书籍简介首先是书籍简介。务虚笔记是史铁生先生的首部长篇小说,于1996年发表在《收获》杂志上。它的行文优美、凝练,情感真挚、厚重,语言平实易读,虽然理解它的内容会让第一次读此书的读者......
  • Rest-Assured 学习笔记
    Rest-Assured学习笔记Rest-Assured学习笔记安装Rest-Assured<dependencies><dependency><groupId>io.rest-assured</groupId><artifactId>rest-assured</artifactId><version>4.3.0</version>......
  • 锐捷策略路由笔记
    概念:内部流量的负载分担:识别到流量后强制更改下一跳冗余备份:如果一侧链路断开会走另一条链路配置接口地址RSR1:intg0/2noswitchipadd192.168.100.124RSR2:intg0/0noswitchipadd192.168.100.224intg0/1noswitchipadd1.1.1.124intg0/2noswitc......
  • Linux学习笔记(复习版day008)
    1.僵尸进程僵尸进程(ZombieProcess)是指那些已经终止(即完成执行)的进程,但其父进程尚未读取其退出状态信息的进程。简单来说,僵尸进程的生命周期已经结束,但它的进程描述符仍然存在于系统中,以便父进程能够获取其退出状态。处理:1.top命令查询是否有僵尸进程,此处1zombie表示有一个......
  • C语言笔记21 字符串
    字符数组charword[]={'H','e','l','l','o','!'};word[0]Hword[1]eword[2]lword[3]lword[4]oword[5]!这不是C语言的字符串,只是字符数组,不能用字符串的方式做计算字符串charword[]={'H','e','l','l&......
  • 《深入理解Java虚拟机》读后笔记-垃圾收集器
    优点:与其他收集器的单线程相比简单而高效,对于内存资源受限的环境,它是所有收集器里额外内存消耗最小的。对于单核处理器或处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率应用场景:Serial收集器对于运行......
  • 大数据之路读书笔记(六)
    前言    上一章主要研究的是无线客户端日志采集中与浏览器端日志采集相对应的技术方案,现在开始要进行无线客户端日志采集特有技术的学习。特殊场景    页面事件和控件点击及其他事件都是一个行为产生一条日志,如果处理普通业务场景是足够的,但是一但业务场景......
  • 六,数组笔记及相关练习题大全
    Java编程基础:数组详解在Java编程中,数组是一块连续固定大小的内存空间,用于存储相同类型的多个元素。数组提供了索引的概念,允许通过索引访问和操作数组中的元素。本文将详细探讨Java中数组的定义、初始化、使用和示例。数组的定义和初始化数组在定义时需要指定数据类型和数组名。......
  • 五,Java控制流程语句最详细笔记
    Java控制流程语句:顺序结构详解在Java编程中,顺序结构是最基本的程序结构之一。它遵循简单的规则:按照代码编写的顺序,自上而下执行。这意味着程序会从上到下依次执行每一行代码,直到最后一行。本文将通过示例代码详细解释顺序结构的概念和应用。顺序结构的概念顺序结构是最简单的程......