首页 > 其他分享 >C语言typedef用法详解(新手必看)

C语言typedef用法详解(新手必看)

时间:2025-01-16 21:59:40浏览次数:3  
标签:typedef 20 必看 int 别名 C语言 类型 PTR

C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。

起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:

struct stu stu1;

struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:

STU stu1;

这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。

使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为:

typedef  oldName  newName;

oldName 是类型原来的名字,newName 是类型新的名字。例如:

typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;

INTEGER a, b;等效于int a, b;

typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:

typedef char ARRAY20[20];

表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:

ARRAY20 a1, a2, s1, s2;

它等价于:

char a1[20], a2[20], s1[20], s2[20];

注意,数组也是有类型的。例如char a1[20];定义了一个数组 a1,它的类型就是 char [20],这一点我在原创教程里的《数组和指针绝不等价,数组是另外一种类型》一文中做了详细地讲解。

又如,为结构体类型定义别名:

typedef struct stu{
    char name[20];
    int age;
    char sex;
} STU;

STU 是 struct stu 的别名,可以用 STU 定义结构体变量:

STU body1,body2;

它等价于:

struct stu body1, body2;

再如,为指针类型定义别名:

typedef int (*PTR_TO_ARR)[4];

表示 PTR_TO_ARR 是类型int * [4]的别名,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针:

PTR_TO_ARR p1, p2;

按照类似的写法,还可以为函数指针类型定义别名:

typedef int (*PTR_TO_FUNC)(int, int);
PTR_TO_FUNC pfunc;

【示例】为指针定义别名。

#include <stdio.h>

typedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);

int max(int a, int b){
    return a>b ? a : b;
}

char str[3][30] = {
    "https://xiexuewu.github.io",
    "C语言",
    "C-Language"
};

int main(){
    PTR_TO_ARR parr = str;
    PTR_TO_FUNC pfunc = max;
    int i;
   
    printf("max: %d\n", (*pfunc)(10, 20));
    for(i=0; i<3; i++){
        printf("str[%d]: %s\n", i, *(parr+i));
    }

    return 0;
}

运行结果:
max: 20
str[0]: https://xiexuewu.github.io
str[1]: C语言
str[2]: C-Language

需要强调的是,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。

typedef 和 #define 的区别

typedef 在表现上有时候类似于 #define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。

1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:

#define INTERGE int
unsigned INTERGE n;  //没问题

typedef int INTERGE;
unsigned INTERGE n;  //错误,不能在 INTERGE 前面添加 unsigned

2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。例如:

#define PTR_INT int *
PTR_INT p1, p2;

经过宏替换以后,第二行变为:

int *p1, p2;

这使得 p1、p2 成为不同的类型:p1 是指向 int 类型的指针,p2 是 int 类型。

相反,在下面的代码中:

typedef int * PTR_INT
PTR_INT p1, p2;

p1、p2 类型相同,它们都是指向 int 类型的指针。

标签:typedef,20,必看,int,别名,C语言,类型,PTR
From: https://blog.csdn.net/zdoeo/article/details/145192571

相关文章

  • C语言数据结构编程练习-单向不带头链表的操作
    单向链表单向链表是由若干个节点组成的数据结构,每个节点包含两个部分:数据域和指针域。数据域存储节点的数据,指针域存储下一个节点的地址。  #include"03.h"voidfn3(){ intorder=0; elementTypeval; elementTypeelementVal; LinkNode*ListNode=NULL; ......
  • C语言数据结构编程练习-用指针创建顺序表,进行创销和增删改查操作
     使用多文件进行编程main.c文件#include"02.h"intmain(){ fn2(); return0;} 02.h 头文件#pragmaonce#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<memory.h>#defineMAX_NUMBER100typedefi......
  • C语言流程控制
    程序的三种流程:顺序、选择(分支)、循环。程序 :一定是这些循环的组合 选择:选择(有排他性)一、关系运算符和关系表达式(一)运算规则运算结果---反映关系是否成立---真假   //在c语言中10表示运算优先级(二)关系表达式二、逻辑运算反映多个表达式之间的......
  • C语言学习笔记:if语句讲解和月份的天数判断以及闰年判断示例
    if语句的格式是:if(关系运算或逻辑运算表达式){语句 }if后如果不加花括号{}则判定只和第一句语句相关:if(n==0)printf(“1”);printf(“2”);//这种写法,if判定与语句2无关 (n==0)是否为真语句2都会打印 为避免if的(关系语句)少打一个= 可以把常量放在左侧如:if(7==n){}当......
  • C语言二级刷题---程序设计01
     请编写一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):程序运行后,如果输入精度0.0005,则程序输出为3.140578。#include<stdio.h>#include<math.h>doublefun(doubleeps){}main(){doublex;voidNONO();......
  • C语言格式输出方式
    C语言格式输出1.转换字符说明C语言格式输出方式2.常用的打印格式在C语言中,格式输出主要依靠printf函数来实现。以下是一些C语言格式输出的代码举例及相关说明:printf("%2d",123),因为输出的部分有三位数,但是要求的有两位,所以原样输出为:123;printf(“%5d”,123),由于输出的......
  • 基于C语言实现UDP服务器
    UDP(UserDatagramProtocol,用户数据报协议)是一种无连接的传输层协议,适用于对实时性有较高要求的应用场景,如视频流传输、语音通信、在线游戏等。与TCP不同,UDP不保证数据的可靠性和顺序性,但其传输速度较快。本文将介绍如何使用C语言编写一个简单的UDP服务器程序,以及如何接收和处理......
  • C语言中数字后缀含义
    1.不带后缀时数字类型数字默认类型整型int浮点型double2.带后缀时数字类型后缀类型带上后缀后的类型整型uunsignedint整型llong整型ulunsignedlong整型lllonglong整型ullunsignedlonglong浮点型ffloat浮点型l......
  • c语言随机数rand与srand用法详解
    源文件test.c:#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){//生成并打印5个随机数for(inti=0;i<5;i++){//生成随机数并打印printf("第%d个随机数:%d\n",i+1,rand());}return0;}注意点:1)当不用srand()函数设置种子时,系统......
  • C语言中操作符的分类和优先级(万字)
    C语言中操作符的分类和优先级1.操作符的分类总结算术操作符单目操作符赋值操作符位操作符逻辑操作符关系操作符三目操作符逗号表达式索引访问操作符函数调用成员访问操作符2.操作符的优先级1.操作符的分类总结算术操作符:+、-、*、/、%单目操作符:++、--、!......