指针数组
指针数组到底是指针还是数组呢?
指针数组是数组,是一个存放指针的数组,也就是数组元素全为指针的数组。例如,一个一维指针数组的定义:int *ptr_array[10]。
数组指针
知道指针数组是什么之后,那么数组指针是什么呢?数组指针实际上他是一个指针,我们常见的整型指针:int *p 这是一个能够指向整型数据的指针,浮点型指针:float *p 这是一个能够指向浮点型数据的指针,那么数组指针就很容易理解了数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。 看一个简单的数组指针 int (*p)【10】;这里p先和*进行结合,那就说明p是一个指针变量,然后指着指向的是一个大小为10个整型数据的数据,所以p是一个指针,它指向了一个数组,就是我们所说的数组指针。(这里要特别的注意一下【 】的优先级是要高于*号的,所以必须加上()来保证p和*先去结合。)
但是这个数组指针到底有什么用处呢?在我目前看来我认为数组指针的最大用处就是来进行传参。不知道学了更多知识之后对这个有没有更深层次的见解。
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
#include<stdio.h>
int max(int x,int y){return (x>y? x:y);}
int main()
{
int (*ptr)(int, int);
int a, b, c;
ptr = max;
scanf("%d%d", &a, &b);
c = (*ptr)(a,b);
printf("a=%d, b=%d, max=%d", a, b, c);
return 0;
}
这是一个用函数指针来调用函数的程序,就是用函数指针来代替函数名对函数进行一个调用。
函数指针数组
之前已经介绍过指针数组,这里的函数指针数组就很容易进行理解了,函数指针数组也是一个数组,不过这个数组中存储的就是函数的地址,那么函数指针数组我们使用的话如果进行定义呢?
int (*parr1[10])() 在这里parr1先和【】进行一个结合,说明parr1是一个数组,那这个数组的内容是什么呢?是int(*)()类型的函数指针,那么函数指针数组的作用是什么呢?最常见的就是我们之前所编写的计算器的程序,不同的运算法则需要不同的函数来进行完成,所以,使用函数指针数组的话程序看起来相对的简单明了。
最后一个我们介绍的就是指向函数指针数组的指针,通过名字就可以确定指向函数指针数组的指针明显就是一个指针,这个指针指向的是一个数组,这个数组中的元素都是函数指针
Void (*pfun0(const char *)=test,这里的pfun是一个函数指针指向的就是函数test,然后定义void (*pfunarr【5】)(const char * str)这里是指向函数指针数组pfunarr,
pfunarr【0】=test
Void(*(*ppfunarr)[10])(const char *)=&pfunarr;
这里指向函数指针数组pfunarr的指针ppfunarr
这篇博客的介绍就说到这里,只是对这些定义的一个简单的概念讲解, 高级指针还有一些其他的内容我会在下次博客进行简单的介绍。