指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)

内容:
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
回忆1,2,3
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
四,数组传参和指针传参
一维数组的传参
[]里面的内容能够省略
arr是首元素地址
传递的是地址可使用指针变量接收
也可使用相同类型的数组进行接收,可是不要求数组长度
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
二维数组的传参
能够省略行可是不能省略列
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
二维数组传参时
当作一维数组的组合
首元素看作一维数组首元素的地址
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
利用数组指针进行接收
int (*)[5]是指针类型
arr是指针变量名
指向的是数组长度为5类型为int的数组
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针传参
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
形式参数是一级指针
实际参数能够是变量的地址
也能够是一级指针变量
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
形式参数是二级指针
实际参数能够是一级指针变量的地址
也能够是二级指针变量
还能够是指针数组
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
五,函数指针
&数组名取出的是数组的地址
数组名取出的是函数首元素的地址
类比:
&函数名取出的是函数的地址
函数名取出的是函数的地址,两者如出一辙
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
函数指针的写法
函数的返回类型 (void)(指针变量p )(形参类型char*)
函数指针的指针类型为
void (*)(char*)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
两段有趣的代码(推荐一本书《C陷阱与缺陷》)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
代码分析:
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
括号里面放一个类型,说明进行强制类型转换
(0强制类型转换为函数指针类型)就是函数的地址
这个函数为无参,无返回类型的函数
(*)解引用,找到这个函数
()而后调用这个函数
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
代码分析:
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
函数的返回类型是去掉函数名(形式参数)剩下 的就是函数的返回类型
signal函数的返回类型为void(*)(int)
他的返回类型也是个函数指针
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
代码二太复杂进行简化
重命名产生函数指针类型
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
注意:
函数指针的重命名与普通类型的重命名不同
将void(*)(int)函数的返回类型重命名为pfun_t
因此函数的声明变为(函数返回类型)pfun_t (函数名)signal (函数形参)(int , *pfun_t )
函数指针的使用:
解引用*函数指针变量名,而后传参
也能够屡次解引用
或者不解引用
均可以
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
pa是函数指针变量名
存放的是函数的地址
通常函数的调用Add(2,3);
因此(pa)(2,3);也能够
pa是函数指针变量名
存放的是函数的地址
*pa解引用pa就是根据pa所存储的函数的地址调用这个函数
因此(*pa)(2,3);也能够
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
注意:
*的优先级低于()的优先级
因此若是没打括号pa先与函数调用的括号结合在与*结合
就使用错误了
若是要使用*pa必须将其用括号括起来(*pa)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
六,函数指针数组
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
函数指针数组的定义
多个函数的返回类型与参数都同样
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
相似指针数组,建立函数指针数组
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
parr先与[4]结合说明parr[4]是一个数组,每一个元素的类型是int(*)(int,int)
函数指针数组的使用:(*可加可不加)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
练习:
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
1.char* my_strcpy(char* dest,const char* src);
char*(*pf)(char* ,const char* )=my_strcpy;
2.char*(*pfArr[4])(char* ,const char* )={my_strcpy1,my_strcpy2,my_strcpy3,my_strcpy4};
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)
函数指针数组的案例:(计算器)
算法的通常实现:算法

#include<stdio.h>
void mnue()
{
    printf("------------------------------------------\n");
    printf("------1.Add         2.Sub-----------------\n");
    printf("------3.Mul         4.Div-----------------\n");
    printf("------      0.exit       -----------------\n");
    printf("------------------------------------------\n");
}
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 Div(int x, int y)
{
    return x / y;
}
int main()
{
    int input = 0;
    int x = 0;
    int y = 0;
    do
    {
        mnue();
        printf("请选择:");
        scanf("%d", &input);

        switch (input)
        {
        case 1:
            printf("请输入两个操做数:");
            scanf("%d%d", &x, &y);
            printf("%d + %d = %d\n", x, y, Add(x, y));
            break;
        case 2:
            printf("请输入两个操做数:");
            scanf("%d%d", &x, &y);
            printf("%d - %d = %d\n", x, y, Sub(x, y));
            Sub(x, y);
            break;
        case 3:
            printf("请输入两个操做数:");
            scanf("%d%d", &x, &y);
            printf("%d * %d = %d\n", x, y ,Mul(x, y));
            break;
        case 4:
            printf("请输入两个操做数:");
            scanf("%d%d", &x, &y);
            printf("%d / %d = %d\n", x, y, Div(x, y));
            break;
        case 0:
            printf("退出\n");
            break;
        default:
            printf("输入错误,请从新输入!\n");
        }
    } while (input);
    return 0;
}

封装函数,利用回调函数优化case里面的冗余项:
回调函数:
指针进阶(二)(详细讲解4,5,6)(零基础学习C语言)数组

#include<stdio.h>
void mnue()
{
    printf("------------------------------------------\n");
    printf("------1.Add         2.Sub-----------------\n");
    printf("------3.Mul         4.Div-----------------\n");
    printf("------      0.exit       -----------------\n");
    printf("------------------------------------------\n");
}
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 Div(int x, int y)
{
    return x / y;
}
void Cacl(int (*pf)(int, int))
{
    int x = 0;
    int y = 0;
    printf("请输入两个操做数:");
    scanf("%d%d", &x, &y);
    printf("%d\n", pf(x, y));
}
int main()
{
    int input = 0;
    do
    {
        mnue();
        printf("请选择:");
        scanf("%d", &input);

        switch (input)
        {
        case 1:
            Cacl(Add);
            break;
        case 2:
            Cacl(Sub);
            break;
        case 3:
            Cacl(Mul);
            break;
        case 4:
            Cacl(Div);
            break;
        case 0:
            printf("退出\n");
            break;
        default:
            printf("输入错误,请从新输入!\n");
        }
    } while (input);
    return 0;
}

利用函数指针数组实现:
当功能多了的时候,case语句不会那么长了ide

#include<stdio.h>
void mnue()
{
    printf("------------------------------------------\n");
    printf("------1.Add         2.Sub-----------------\n");
    printf("------3.Mul         4.Div-----------------\n");
    printf("------      0.exit       -----------------\n");
    printf("------------------------------------------\n");
}
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 Div(int x, int y)
{
    return x / y;
}
int main()
{
    int input = 0;
    int x = 0;
    int y = 0;
    do
    {
        mnue();
        printf("请选择:");
        scanf("%d", &input);
        int (*pArr[5])(int, int) = { 0,Add,Sub,Mul,Div };
        //故意设5个,使得选择的函数能够对应下标
        if (input >= 1 && input <= 4)
        {
            printf("请输入两个操做数:");
            scanf("%d%d", &x, &y);
            printf("%d\n", pArr[input](x, y));
        }
        else if (input == 0)
        {
            printf("退出\n");
        }
        else
        {
            printf("输入错误,请从新输入!\n");
        }
    } while (input);
    return 0;
}
相关文章
相关标签/搜索