1.·指针数组
回顾:int arr[5]; 整型数组,表示数组中每一个元素都是一个int类型
char arr[5]; 字符数组,表示数组中每一个元素都是char
struct Student ss[5]; 结构体数组,表示数组中每一个元素都是一个结构体
指针数组:表示数组中的每一个元素都是一个指针
1.1定义
数据类型* 数组名[数组长度];如:
int* pArr[5]; ->表示一个具有5个元素的数组,数组中每一个元素都是int* 类型的;
2.数组指针
2.1概念
首先区别一下:指针数组:首先是一个数组,然后数组中每一个元素是个指针字符指针:用来指向一个字符的指针
整型指针:用来指向一个整型变量的指针
数组指针:用来指向一个数组的指针
结构体指针:指向一个结构体变量的指针
2.2格式
数据类型 (*变量名)[数组的长度]如:
int* arr[5]; //表示指针数组->一个具有5个元素长度的数组,数组中每一个元素都是int*类型
int(*arr)[5]; // 表示数组指针->首先是一个指针,一个指向 具有5个int类型元素的数组 的指针
3.函数指针
3.1 概念
数组指针:指向数组的指针函数指针:指向函数的指针
3.2格式
函数的格式: 返回值类型 函数名(形参)函数指针的格式: 返回值类型 (*函数指针名)(形参)
3.3 举例
int* fn(int i);表示fn 是一个函数,一个具有int类型形参和int*类型返回值的函数int (*fn)(int i);表示fn是一个函数指针,一个指向具有int类型形参和int类型返回值函数的指针
练习:
编写一个用于给指定数组元素进行排序的函数;如:
void sort(int arr[],int len)
{
从大到小排序;
}
扩展:
man signal
函数的介绍: #include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
函数的解析:
typedef void (*)(int) sighandler_t;
=>typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
=>void (*)(int) signal(int signum,void (*)(int) handler)
=>void (*signal(int signum,void (*handler)(int))) (int)
=>signal是一个函数,一个具有整型参数和函数指针参数的函数,并且这个函数的返回值类型也是一个函数指针
第二个形参:一个函数指针,指向 参数为int,返回值为void 的函数
返回值:一个函数指针,指向参数为int,返回值为void的函数
4 .指针小结:
4.1类型
int i;定义一个整型变量int* p;定义一个指向int类型变量的指针
int arr[n];定义一个具有n个int类型元素的数组
int* pArr[n];定义一个具有n个int*类型元素的数组
int(*qArr)[n];定义一个指针,指向一个长度为n,元素为int类型的数组
int fn(void);定义一个不需要形参,返回值为int类型的函数
int* fn(void);定义一个不需要形参,返回值为int* 的函数
int (*fn)(void);定义一个指针,指向无参并且返回值为int的函数
int** ppi;二级指针,指向一个保存整型变量地址的一级指针
4.2特殊指针
int* p; //野指针int* p = NULL; //空指针
void* p; //通用指针
5 .main 函数的原型
int main(int argc,char* argv[])5.1函数的描述
第一个参数表示:运行程序时参数的个数;第二个参数表示:存储每一个参数的首地址5·2 举例
当输入 :./a.out abc 123main 函数中:argc = 3;argv保存地址