C语言中,指针可以说是C语言的灵魂,我们想要熟练运用C语言,必须深入的了解指正的各种类型,及其该如何运用。
以下是我对一些指针的总结:
1、指针数组
2、数组指针
3、函数指针
4、函数指针数组
5、指向函数指针数组的指针
一、指针数组
指针数组:是一个数组,数组的每一个元素都是指针。
例如:
int *arr[10] 一个存放 10个 int * 指针的数组
char **arr[10] 一个存放 10 个 int ** 指针的数组
二、数组指针
数组指针:数组指针是一个指针,该指针指向的是一个数组。
例如:
int (*p)[10] 一个p指针,指向一个数组大小为10的数组
指针数组,数组指针,名字绕口,但我们区分他们,只需要掌握 ‘ * ’ 和 ‘ [ ]’的优先级,‘ [ ]’的优先级比‘ * ’高,而()的优先级又比‘ [ ] ’高。
如上面的例子
int arr[10] ,arr先与‘[ ]’先结合,它肯定是一个数组,存放的是int ,所以是指针数组。
int (p)[10] , p先与 ‘ ’结合,它肯定是一个指针,指向的是int型大小为10的一个数组。
我们在使用数组指针的时候应该注意,类型是否匹配。如果要接受一个数组的指针,我们应该定义接受数组地址的指针为数组指针。
int arr[5] = {0};
int *p = &arr; //这是类型不匹配,&arr得到的是数组的地址
int (*p)[5] = &arr; //正确
三、函数指针
函数指针:函数指针就是一个指针,指向一个函数。
我们知道函数也是有地址的,当我们想调用函数的时候,我们可以通过它的地址使用它。就是函数指针。使用它的时候我们也需要注意类型匹配的问题。
void (*pfun)() //pfun与‘*’结合,是一个指针,指向的是一个返回值为void,没有参数的函数
四、函数指针数组
函数指针数组:它是一个数组,数组每个元素都是一个函数指针。
下面是一个函数指针数组简单使用的例子:
int test1(int x,int y)
{
return x+y;
}
int test2(int x, int y)
{
return x-y;
}
int main()
{
int num = 0;
int num1 = 0;
int num2 = 0;
int ret = 0;
int (*p[3])(int x,int y) = {0,test1,test2};
printf("*******************\n");
printf("***1.add 2.sub***\n");
printf("*******************\n");
printf("please enter:\n");
scanf("%d",&num);
if(num == 1)
{
printf("enter num1 & num2:\n");
scanf("%d %d",&num1,&num2);
ret = p[1](num1,num2); //函数指针数组的使用
}
else if(num == 2)
{
printf("enter num1 & num2:\n");
scanf("%d %d",&num1,&num2);
ret = p[2](num1,num2); //函数指针数组的使用
}
printf("输出结果为 %d\n",ret);
system("pause");
return 0;
}
五、指向函数指针数组的指针
函数指针数组的指针:是一个指针,指针指向一个数组,数组的每个元素是函数指针。
void test(const char* str)
{
printf("%s\n",str);
}
int main()
{
void (*pfun1)(const char*) = test; //函数指针pfun1
void (*pfun2[3])(const char *str); //函数指针数组pfun2
pfun2[0] = test;
void (*(*pfun3)[3]))(const char*) = &pfun2;//指向函数指针数组的指针pfun3
return 0;
}
我们只有知道‘ * ’和‘ [ ] ’的优先级,我们就能区别是指针还是数组。以上就是我对一些指针的总结。