指针进阶后续

简介: 指针进阶后续

hi,小魏又来了,哈哈哈,没想到吧

今天的主要内容是讲解一下一维数组传参,二维数组传参,数组指针和函数指针

      1  一维数组传参

    2二维数组传参

 3函数指针

4 转移表的实现与优化

我们先上一段代码




注意了,主函数中是数组,那在形参中写成一样的形式也可以

形参接收的的是一维数组的首地址,所以形参里写成指针的形式用来接收一维数组的地址

二维数组的传参


同理,主函数中是二维数组,形参中就用二维数组来接收



二维数组在传参时,传的也是首元素的地址,但是非常特殊的是二维数组的首地址是第一行数组元素,所以我们拿数组指针接收它,数组有5个元素,对p+1就得到第二行的元素的首地址,对于一个数组来说知道其首元素的地址,就可以遍历所有元素


我们要记住


二维数组存储,行可以省略,列不可以省略。在形参中也一样。

3.函数指针

 

4.转移表

二话不说,上代 码


//优化以后
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 menu()
{
    printf("**************************\n");
    printf("*******1.add   2.sub******\n");
    printf("*******1.mul   2.div******\n");
    printf("******* 0.exit      ******\n");
    printf("**************************\n");
}
//转移表
int (*pfArr[])(int, int) = { 0, Add, Sub, Mul, Div }; 
int main()
{
    int input = 0;
    int x = 0;
    int y = 0;
    int ret = 0;
 do
{
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    if (input == 0)
    {
        printf("退出计算器\n");
    }
    else if (input >= 1 && input <= 4)
    {
        printf("请输入2个操作数:>");
        scanf("%d%d", &x, &y);
        ret = pfArr[input](x, y);
        printf("ret = %d\n", ret);
    }
    else
    {
        printf("选择错误\n");
    }
} while (input);
return 0;
}


未优化


//函数指针
int Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int arr[10];
    int(*p)[10] = &arr;//p是一个数组指针变量
    printf("%p\n", &Add);
    printf("%p\n,Add");
    int (*pf)(int, int) = Add;//这个就是函数指针变量
    int ret = (*pf)(2, 3);
    int ret = pf(2, 3);
    printf("%d\n", ret);
    return 0;
}
//这是实现转移表需要的函数
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 menu()
{
    printf("**************************\n");
    printf("*******1.add   2.sub******\n");
    printf("*******1.mul   2.div******\n");
    printf("******* 0.exit      ******\n");
    printf("**************************\n");
}
int main()
{
    int input = 0;
    int x = 0;
    int y = 0;
    int ret = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        ret = Add(x, y);
        switch (input)
        {
        case 1:
            printf("请输入两个操作数:>");
            scanf("%d%d", &x, &y);
            ret = Add(x, y);
            printf("ret=%d\n", ret);
            break;
        case 2:
            printf("请输入两个操作数:>");
            scanf("%d%d", &x, &y);
            ret = Sub(x, y);
            printf("ret=%d\n", ret);
            break;
        case 3:
            printf("请输入两个操作数:>");
            scanf("%d%d", &x, &y);
            ret = Mul(x, y);
            printf("ret=%d\n", ret);
            break;
        case 4:
            printf("请输入两个操作数:>");
            scanf("%d%d", &x, &y);
            ret = Div(x, y);
            printf("ret=%d\n", ret);
            break;
        case 0:
            printf("退出计算器\n");
            break;
        default:
            printf("选择错误");
            break;
        }
    } while (input);
    return 0;
}


优化以后的代码就是采用了函数指针数组,

 

今天下魏就更新到这里,咱们下期子再见,886!

相关文章
|
2月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
2月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
2月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
2月前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
2月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
2月前
|
搜索推荐
指针进阶(2)
指针进阶(2)
35 4
|
2月前
指针进阶(3)
指针进阶(3)
29 1
|
2月前
|
C++
指针进阶(1)
指针进阶(1)
32 1
|
2月前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
24 2
|
2月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
29 0