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