指针数组
- 是个数组,是一个可以存放指针的数组
int * a[10] 是一个整型数组。
char** a[10]是一个二级指针数组。
数组指针
是一个指针
int(*p)[10],int(*p)表示是一个指针变量,[10]则表示指向一个数组
可以通过数组指针找到数组里面的内容,主要应用于二级指针的访问
数组指针的赋值:
int (*parr)[10] = &arr;
等价于
* ( * ( parr + 0)+ x)
- 二维指针访问示例:
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("%d", *(*(p+i)+j));
}
}
函数指针
是个指针
“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。
这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数 。
如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。
函数指针有两个用途:调用函数和做函数的参数。
函数指针数组
即将函数的地址存在一块联系的地址中
函数指针的一个用法出现在菜单驱动系统中。例如程序可以提示用户输入一个整数值来选择菜单中的一个选项。用户的选择可以做函数指针数组的下标,而数组中的指针可以用来调用函数。
int main()
{
int(*p1)(int, int) = Add;//函数指针数组的内容函数
int(*p2)(int, int) = Sub;
int(*pFunArr[4])(int, int);//函数指针数组
}
指向函数指针数组的指针
- 示例
void(*signal(int, void(*)int))(int);//函数的声明
void(*signal(int a, void(*pFun)(int)))(int)//函数的定义
{
return NULL;
}
- signal是一个函数的声明,函数的第一个参数类型是int,第二个参数类型是一个函数指针,这个指针能够指向参数为int,返回类型为void的函数。signal函数的返回类型也是一个函数指针,该指针能够指向函数类型为int,返回值类型为void的函数。
回调函数
通过函数指针调用函数
主要应用:计算器的应用;
qsort函数
- qsort函数的使用
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*n1, const void*n2)
{
return *(int*)n1-*(int*)n2;
}
int main()
{
int arr[] = {6,5,4,3,2,1};
int sz = sizeof(arr);
int sz_1 = sizeof(arr[0]);
int n = sizeof(arr)/sizeof(arr[0]);
int i = 0;
qsort(arr, n, sz_1, cmp);
for(i=0; i<n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}