typedef关键字的用法

(1)typedef是C语言中一个关键字,作用是用来定义(或者叫重命名类型)
(2)C语言中的类型一共有2种:一种是编译器定义的原生类型(基础数据类型,如int、double之类的);第二种是用户自定义类型,不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····)。
(3)我们今天讲的数组指针、指针数组、函数指针等都属于用户自定义类型。
(4)有时候自定义类型太长了,用起来不方便,所以用typedef给它重命名一个短点的名字。
(5)注意:typedef是给类型重命名,也就是说typedef加工出来的都是类型,而不是变量。
栗子如下:

typedef char* (*ptype)(char*, const char*);
新类型名为:ptype ,类型为:char* (*)(char*, const char*);

用函数指针调用执行函数

用函数指针指向不同的函数来实现同一个调用执行不同的结果

代码示例

#include<stdio.h>

typedef int (*func)(int,int);//定义了函数指针类型

int add(int a,int b);
int sub(int a,int b);
int multiply(int a,int b);
int divide(int a,int b);


int main(void)
{
    func p1 = NULL;
    char c = 0;
    int a = 0,b = 0,result = 0;

    printf("请输入要操作的两个整数:\n");
    scanf("%d %d",&a,&b);

    printf("请输入操作类型:‘+’‘-’‘*’‘/’\n");


    do
    {
        scanf("%c",&c);/* code */
    } while (c =='\n');
    
    
    //加一句调试
    printf("a = %d,b = %d,c = %c.\n",a, b, c);
    switch (c)
    {
    case '+':
        p1 = add;break;
    case '-':
        p1 = sub;break;
    case '*':
        p1 = multiply;break;
    case '/':
        p1 = divide;break;
    
    default:
        p1 = NULL;
        break;
    }


    result = p1(a,b);
    printf("%d %c %d = %d.\n",a, c, b, result);



    return 0;

}


int add(int a,int b)
{
    return a+b;
}

int sub(int a,int b)
{
    return a-b;
}

int multiply(int a,int b)
{
    return a*b;
}

int divide(int a,int b)
{
    return a/b;
}

刚才的调试过程,知识点总结:

第一:当程序出现段错误时,第一步先定位段错误。定位的方法就是在可疑处加打印信息,从而锁定导致段错误的语句,然后集中分析这句为什么会段错误。
第二:linux中命令行默认是行缓冲的,意思就是说当我们程序printf输出的时候,linux不会一个字一个字的输出我们的内容,而是将其缓冲起来放在缓冲区等一行准备完了再一次性把一行全部输出出来(为了效率)。linux判断一行有没有完的依据就是换行符'\n'(windows中换行符是\r\n, linux中是\n,iOS中是\r)。也就是说你printf再多,只要没有遇到\n(或者程序终止,或者缓冲区满)都不会输出而会不断缓冲,这时候你是看不到内容输出的。因此,在每个printf打印语句(尤其是用来做调试的printf语句)后面一定要加\n,否则可能导致误判。
第三:关于在linux命令行下用scanf写交互性代码的问题,想说以下几点:
1.命令行下的交互程序纯粹是用来学习编程用的,几乎没有实践意义,大家别浪费时间了。
2.scanf是和系统的标准输入打交道,printf和标准输出打交道。要完全搞清楚这些东西得把标准输入标准输出搞清楚。
3.我们用户在输入内容时结尾都会以\n结尾,但是程序中scanf的时候都不会去接收最后的\n,导致这个回车符还存留在标准输入中。下次再scanf时就会先被拿出来,这就导致你真正想拿的那个数反而没机会拿,导致错误。

最后修改:2019 年 09 月 28 日
如果觉得我的文章对你有用,请随意赞赏