指针和数组

来源:互联网 发布:怎样改淘宝密码 编辑:程序博客网 时间:2024/06/05 06:03

指针数组和数组指针
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身
决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节,
至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

int *p1[10],int (*p)p2[10]
“[]”的优先级比“”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int 修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含 10 个指向 int 类型数据的指针,即指针组。“()”的优先级比“[]”高,“*”号和 p2 构成一个指针的定义,指针变量名为 p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚 p2 是一个指针,它指向一个包含 10 个 int 类型数据的数组,即数组指针。
这里写图片描述
函数指针和函数指针数组
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法为:
返回值类型 ( * 指针变量名) ([形参列表]);
注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表
例如:
int func(int x); /声明一个函数 /
int (*f) (int x) ; /声明一个函数指针/
f=func; / 将func函数的首地址赋给指针f /
或者使用下面的方法将函数地址赋给函数指针:
f = &func;
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

#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;}

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和–运算,用时要小心。
现在我们清楚表达式char*(*pf)(char*p) char*(*pf)(char*p)定义的是一个函数指针 pf。既然 pf 是一个指针,那就可以储存在一个数组里。把上式修改一下:char*(*pf[3])(char*p);这是定义一个函数指针数组。它是一个数组,数组名为 pf,数组内存了 个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。关键是你明白这是一个指针数组,是数组。

int add(int x,int y)  {      return x+y;  }  int abb(int x,int y)  {      return x-y;  }  int main()  {      int (*p[])(int a,int b) = {add,abb}; //p[]就是一个函数指针数组,可以存放上面类型的函数     printf("%d",p[1](1,2)); //此时将函数作为元素存放在函数指针数组中 }  

函数指针数组的指针
函数指针数组指针就是一个指针。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。

#include <stdio.h>#include <string.h>char * fun1(char * p){printf("%s\n",p);return p;}char * fun2(char * p){printf("%s\n",p);return p;}int main(){char * (*a[2])(char * p);char * (*(*pf)[2])(char * p);//这个指针指向一个包含了 2 个元素的数组;这个数字里面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。pf = &a;a[0] = fun1;a[1] = &fun2;pf[0][0]("fun1");pf[0][1]("fun2");return 0;}
0 0
原创粉丝点击