您的位置:首页 > 编程语言 > C语言/C++

C语言_函数指针数组指针

2017-11-23 22:17 225 查看
函数指针数组指针?这是个啥玩意?第一次遇到我也是黑人问号脸,后来发现理解这个其实也不难,就是一个指向数组的指针而已,而这个数组里面的元素保存的是指向函数的指针。我们可以先从指针数组开始了解,由浅入深。

一、指针

指针就是地址,指针变量才是可以保存地址的变量,不过我们一般把指针变量简称为指针而已。指针变量的大小永远都是4个字节,指针的类型决定他指向数据的类型。

二、指针数组

指针数组是一个数组,元素是由指针变量组成的。

int *p[ ];

int *p[5]; //有5个元素的一维数组,每个元素都是一个int* 类型的指针变量

int *p[2][3]; //一个二维指针数组,

int *(p[ ]); //因为[ ]的优先级比*的高,所以这里的()可以省略。

int main()
{
int a=1;
int b=2;
int c=3;
int *p1=&a;
int *p2=&b;
int *p3=&c;
int *p[]={p1,p2,p3};
printf("%d %d %d\n",*p[0],*p[1],*p[2]);
return 0;
}


输出的结果是 1 2 3



三、数组指针

数组指针是一个指针变量,这个指针指向一个数组。

int (*p)[ ];

int (*p)[5]; //指向一个有5个元素数组的指针

char arr1[5] = "abcde";
char(*p1)[5] = &arr1;
char arr2[5][5] = { "abcde", "fghij" };
char(*p2)[5] = arr2;
printf("%c %c %c %c",**p1,p1[0][3],*(*(p2+1)+1),p2[1][2]);


输出结果:a d g h

**p1和p[0][0]是等价的,p1指向arr1数组的首地址,p1[0][3]等价于(*p)[3]就相当于arr[3]了。

p2[1][2]等价于*(*(p+1)+2),代表arr[1][2].

在内存里,因为p1是char*[5]类型,所以p1+1就是往高地址挪5个字节,*p1是char*类型,*p1+1是望高地址挪一个字节。

四、函数指针

是一个指针变量,一个指向函数的指针变量

void *str1;
void *str2;
void fun(void* p1,void* p2);
void (*p)(void*,void*)=fun;
(*p)(str1,str2);


p就是指向函数fun的指针变量,可以通过*p实现对fun函数的调用。

五、函数指针数组

是一个数组,成员是函数指针变量的数组。

其实这个的理解可以参照指针数组,指针数组成员是指针变量,函数指针数组成员是函数指针变量。在我个人的理解,函数指针变量是指针变量的一种,所以函数指针数组也是指针数组的一种。

关于函数指针数组的定义 int *p[ ] ( );表示为成员类型是int* ()函数指针的数组。

六、函数指针数组指针

讲了半天终于到我我们最终目的地,前面讲了这么多再看过来相信已经心里有了答案,函数指针数组指针就是一个指针变量,一个指向数组的指针变量,一个指向成员是函数指针变量的数组的指针变量。是数组指针的一种,所以用法其实也与数组指针差不多了。

void fun1()
{
printf("fun1\n");
}

void fun2()
{
printf("fun2\n");
}

void fun3()
{
printf("fun3\n");
}

int main()
{
void* p1=fun1;
void* p2=fun2;
void* p3=fun3;
void *arr[3]()={p1,p2,p3};
void *(*p)[3]()=arr;
p[0][0];
p[0][1];
p[0][2];
}


输出结果:fun1

fun2

fun3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针
相关文章推荐