浅谈指针数组、数组指针及函数指针

C语言中,指针可以说是C语言的灵魂,我们想要熟练运用C语言,必须深入的了解指正的各种类型,及其该如何运用。
以下是我对一些指针的总结:

1、指针数组
2、数组指针
3、函数指针
4、函数指针数组
5、指向函数指针数组的指针

一、指针数组

指针数组:是一个数组,数组的每一个元素都是指针。
例如:

   int *arr[10]      一个存放 10int * 指针的数组
   char **arr[10]    一个存放 10int ** 指针的数组

二、数组指针
数组指针:数组指针是一个指针,该指针指向的是一个数组。
例如:

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

我们只有知道‘ * ’和‘ [ ] ’的优先级,我们就能区别是指针还是数组。以上就是我对一些指针的总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值