目录
一、字符指针
二、数组指针
三、指针数组
四、函数指针
五、函数指针数组
六、指向函数指针数组的指针
在指针的类型中我们知道有一种指针类型为字符指针 char*
int main()
{
const char* pstr = "hello bit.";
printf("%s\n", pstr);
return 0;
}
那下面的这道题的结果又是什么呢?
#include
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组
int *p1[10];
int (*p2)[10];
答案是:int (*p)[10];
注:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
函数指针本质上是指针。
#include
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
输出的是两个地址,这两个地址都是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
void test()
{
printf("hehe\n");
}
int mian()
{
void (*ptest2)() = &test;
return 0;
}
数组是一个存放相同类型数据的存储空间,那要把函数的地址存到一个数组中,这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
int (*parr1[10])();
int *parr2[10]();
int (*)() parr3[10];
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
void (*pfun)(const char*) = test; //函数指针pfun
void (*pfunArr[5])(const char* str); //函数指针的数组pfunArr
pfunArr[0] = test;
void (*(*ppfunArr)[5])(const char*) = &pfunArr; //指向函数指针数组pfunArr的指针ppfunArr
return 0;
}