指针进阶

指针数组

指针数组是数组,是一个存放指针的数组

int * ptr_array[10]
char *arr2[4]

指针数组是数组元素为指针的数组,本质上是数组
- *p[2]是数组指针,实质是数组,里面两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合形成数组p[2] 再与*结合,表示此数组是指针类型的,每个数组元素的相当于一个指针变量。
- 相比较二维数组,指针数组有明显的 优势的优点:一是指针数组中的每个元素的所指的字符串不必限制在在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标式要高。但是二维数组又可以通过下标很容易的修改某一个元素的值。

函数指针

函数指针是指向函数的指针变量,因此函数指针本身是一个指针变量

void test90
{
  printf("hehe\n");
}
void (*arr)();

这个arr先于*结合形成指针,然后指针指向的是一个函数

#incliude<stdio.h>
int max(int x,int y) //函数
{
 return (x>y?x:y);
}
int main()
{
int (*prt)(int,int); //定义函数
int a,b,c;
prt=max; //指向函数
scanf("%d%d",&a,&b);
c=(*prt)(a,b);调用函数
return 0;
}

函数指针数组

函数指针数组是一个其元素是函数指针(是指向函数入口地址)的数组

#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
int add(int x, int y)
{
    return x + y;
}
int sub(int x, int y)
{
    return x - y;
}
int mul(int x, int y)
{
    return x*y;
}
int mydiv(int x, int y)
{
    return  x / y;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    char methodLable[5] = { '.', '+', '-', '*', '/' };
    int(*p[5])(int, int) = { 0, add, sub, mul, mydiv };
    while (input)
    {
        printf("      终端小型计算器          \n");
        printf("******************************\n");
        printf("***1 add         2 sub********\n");
        printf("***3 mul         4 div********\n");
        printf("*******   0 exit     *********\n");
        printf("******************************\n");
        printf("请输入运算和数字:");
        scanf("%d", &input);
        if ((input <= 4 && input >= 1))
        {
            printf("请输入要操作数的两个整数\n");
            scanf("%d%d", &x, &y);
            ret = p[input](x, y);
            printf("%d %c %d=%d", x,methodLable[input],y, ret);
        }
        else
        {
            printf("你的输入有误请重新输入\n");
        }
        system("pause");
        system("cls");
    }
   return 0;
  • 上面的例子可以展现出函数数组指针的重要用途转移表

指向函数指针数组的指针

只想函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针

void(*p)(const char*)   //函数指针arr
void(*parr[5])(const char* )   //函数指针数组arr
void(*(*pparr)[5])(const char*)  //指向函数指针数组的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lao_wine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值