重点讲述:
1.字符指针
2.数组指针
3.指针数组
4.数组传参和指针传参
5.函数指针
6.函数指针数组
7.指向函数指针数组的指针
8.回调函数
1.字符指针
在指针的类型中我们知道有一种指针类型为字符指针char*
一般使用:
还有一种使用方式如下:
代码const char*pstr ="zhu ying.";
有人可能以为是吧字符串zhu ying放到字符函数指针pstr里了,但是本是把字符串zhu ying.首字符的地址放到了pstr中。
既然如此,有一道有意思的题,你们可以先猜猜输出什么:
这里最终输出结果是:
这里str3和str4指向的是一个同一个常量字符串。c会把常量字符串存储到单独的一个内存区域,当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串取初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同
2.指针数组
在上一张指针初阶讲过了,忘记的可以回去看看
3.数组指针
3.1数组指针的定义
数组指针是指针还是数组?
答案是:指针。
我们已经熟悉:
整形指针:int*p能够指向整型数的指针。
浮点型指针:float*p能够指向浮点型数据的指针。
那数组指针应该是:能够指向数组的指针。
下面代码哪个是数组指针?
解释:(用操作符的优先级判断)
int (*p)[10];
p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
这里要注意:[]的优先级要高于*号,所以必须加上()来保证p先和*结合。
3.2&数组名VS数组名
对于下面的数组
int arr[10];
arr和&arr分别是啥?
我们知道arr是数组名,数组名表示数组首元素的地址。
那&arr数组名到底是啥?
我们看一段代码:
运行结果如下:
可见数组名和&数组名打印的地址是一样的。
难道两个就是一样的吗?
我们再看一段代码:
根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义是不一样的。
实际上:&arr表示的是数组的地址,而不是数组首元素的地址。(显示是首元素地址,实际却不是)
&arr的类型是:int(*)[10],是一种数组指针类型
数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是4*10=40。
3.3数组指针的使用
那数组指针是怎么使用的呢?
既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。
看代码:
p=&arr,所以*p=*&arr,因为*&可以互相抵消,变成*p=arr,所以要取出arr里面的整型直接*p[数字];
一个数组指针的使用:
学了指针数组和数字指针我们来一起看一下下面代码的意思:
4.数组参数、指针参数
在写代码的时候难免要把【数组】或者【指针】传给函数,那函数的参数该如何设计呢?
4.1一维数组传参
4.2二维数组传参
4.3一级指针传参
思考:当一个函数的参数部分为一级指针的时候,函数能接收什么参数?
比如:
4.4二级指针传参
思考:当一个函数的参数部分为二级指针的时候,函数能接收什么参数?
5.函数指针
首先看一段代码:
输出结果:
输出的是两个地址,这两个地址是test函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
p1可以存放。p1先和*结合,说明p1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void
函数指针的运用:
6.函数指针数组
数组是一个存放相同类型数据的存储空间。
那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针数组如何定义?
p先和[]结合,说明p是数组,数组的内容是int(*)()类型的指针。
函数指针数组的用途:转移表
例子:(计算机)
7.指向函数指针数组的指针
指向函数指针数组的指针是一个指针
指针指向一个数组,数组的元素都是函数指针;
如何定义?
8.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这时回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应。
首先演示一下qsort函数的使用:
输出结果:(qsort排序,默认升序,若想得到倒序,则将函数return中的p1和p2位置互换)
用qsort来排序结构体
1.按照年龄排序
2.按照名字排序
标签:arr,函数,指向,数组,函数指针,指针,进阶 From: https://blog.csdn.net/2301_78702440/article/details/143768669