简述指针数组 数组指针 函数指针 函数指针数组和函数指针数组的指针

来源:互联网 发布:ext3 windows 编辑:程序博客网 时间:2024/05/17 23:51

(1)指针数组:实际上是一个数组,只不过数组内存放的是指针,我们把它叫做指针数组;
由于它是一个数组,它是不能从堆空间里申请空间的。 只能做个循环,每个元素去申请空间,或者每个元素去指向另外的地址空间。
例如:int *arr[10] //这是一个一维指针数组;
具体用法如下:

int main(){    //定义两个指针    char *a = "hello";    char *b = "bit";    //定义一个指针数组    char *arr[2];    arr[0] = a;    arr[1] = b;    for (int i = 0; i < 2; i++)    {        printf("%s ",arr[i]);    }    printf("\n");    return 0;}

运行结果:

(2)数组指针:一个指向一维或者多维数组的指针
例如:int(*p)[10];//指向一维数组的指针

int main(){    int arr[10] = { 0 };    printf("%p\n", arr);    printf("%p\n", arr + 1);    printf("%p\n", &arr);    printf("%p\n", &arr + 1);    return 0;}

运行结果:

从上面的结果中可以看出:arr+1 加上了一个元素大小, 而&arr+1 加上了整个数组的大小,这是为什么呢?这是因为arr表示的是数组首元素的地址,而&arr表示的是数组的地址;数组的地址和数组首元素的地址是相同的,但表示的意义不同。

数组指针的简单用法:

int main(){int arr[10]={0};int (*p)[10]=&arr;//正确;int (*p)[11]=&arr;//错误;}

(3)函数指针:顾名思义,指向函数的指针;
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法:

type (*func)(type &,type &)

该语句声明了一个指针func,它指向了一个函数,这个函数带有了2个type型参数并返回一个type的值。
p.s. type类型可以被看成是int或者是float等C的类型。

函数指针应用示例:
1)调用函数

void(*FunP)(int); //也可申明成void(*FunP)(int x),但习惯上一般不这样。void MyFun(int x) //这里定义一个MyFun函数{    printf("%d\n", x);}int main(int argc, char* argv[]){    MyFun(10); //这是直接调用MyFun函数    FunP = &MyFun; //将MyFun函数的地址赋给FunP变量    (*FunP)(20); //这是通过函数指针变量FunP来调用MyFun函数的。}

2)做函数的参数

void MyFun1(int x);void MyFun2(int x);void MyFun3(int x);typedef void(*FunType)(int); // 定义一个函数指针类型FunType,与MyFun1函数类型一致 void CallMyFun(FunType fp, int x);int main(){    CallMyFun(MyFun1, 10); // 通过CallMyFun函数分别调用三个不同的函数     CallMyFun(MyFun2, 20);    CallMyFun(MyFun3, 30);}void CallMyFun(FunType fp, int x) //参数fp的类型是FunType。{    fp(x);      // 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的。}void MyFun1(int x) // 这是个有一个参数的函数,以下两个函数也相同。 {    printf("函数MyFun1中输出:%d\n", x);}void MyFun2(int x){    printf("函数MyFun2中输出:%d\n", x);}void MyFun3(int x){    printf("函数MyFun3中输出:%d\n", x);}

(4)函数指针数组:就是存储函数指针的数组
函数指针数组的定义:

type (*parr[10])(type &)  //参数可多个;

函数指针数组的使用:

int add1(int a1,int b1);int add2(int a2,int b2);int main(){    int numa1=1,numb1=2;    int numa2=2,numb2=3;    int (*op[2])(int a,int b);    op[0]=add1;    op[1]=add2;    printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));    system("pause");    return 0;}int add1(int a1,int b1){    return a1+b1;}int add2(int a2,int b2){   return a2+b2;}

(5)函数指针数组的指针:
函数指针就够一般初学者折腾了,函数指针数组就更加麻烦,现在的函数指针数组指针就更难理解了。
其实,没这么复杂。前面详细讨论过数组指针的问题,这里的函数指针数组指针不就是
一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。仅
此而已。
简单定义:

type *(*(*pf)[3])(type *p);

下面举个栗子解释一下:

char * fun1(char * p){printf("%s\n",p);return p;}char * fun2(char * p){printf("%s\n",p);return p;}char * fun3(char * p){printf("%s\n",p);return p;}int main(){ char * (*a[3])(char * p);char * (*(*pf)[3])(char * p);pf = &a;a[0] = fun1;a[1] = &fun2;a[2] = &fun3;pf[0][0]("fun1");pf[0][1]("fun2");pf[0][2]("fun3");return 0;}

这里的pf 确实是实实在在的指针。这个指针指向一个包含了3 个元素的数组;这个数字里
面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个
指向字符的指针的函数。这比上面的函数指针数组更拗口。其实你不用管这么多,明白
这是一个指针就ok 了。


阅读全文
0 0
原创粉丝点击