typedef为指针定义别名

对指针和函数指针定义别名涉及到优先级,查看《C语言声明的优先级》那篇

1、

C语言typedef的用法详解 (biancheng.net)

typedef char CHAR20[20];    //CHAR20是类型char [20]的别名。它是一个长度为 20 的数组类型
CHAR20 a1, a2, a3, a4;     //char a1[20], a2[20], a3[20], a4[20]

 

#include <stdio.h>
 
typedef char (*PTR_TO_ADDR)[30];             //PTR_TO_ARR是二位数组char *[30]的别名,是二维数组指针类型
  
char str[3][30] = {
    "hello",
    "world",
    "!"
};
 
int main()
{
    PTR_TO_ADDR paddr = str;    int i;
        for(i=0; i<3; i++)
    {
        printf("%s  ", paddr[i]);   
    }
}

运行结果:

hello  world  !  

 2、typedef

学习链接:初识 typedef void(*Func)(void) (qq.com)

void (* fun)(void)

fun是一个变量,它是个指针,指向一个函数,函数的参数和返回值都是空,fun是一个指向参数和返回值都为空的函数指针。

type void (* fun)(void)是函数指针的类型定义,代表了一种新的类型,声明一种void (*)(void)类型的函数指针fun。

 

typedef为现有类型创建一个新的名字,typedef能隐藏笨拙的语法构造以及平台一些相关的数据类型,增强代码可维护性、可移植性、可读性

#include <stdio.h>

typedef void (*PTR_TO_FUN)(int, int); //PTR_TO_FUN是一个函数指针

void max(int a, int b){
  int c;
  c = a>b ? a : b;
  printf("%d\n", c);
}

int main()
{
  PTR_TO_FUN pfun = &max; //&可加可不加

  pfun(10, 20); //第一种调用方式
  (*pfun)(10, 20); //第二种调用方式
}

结果:

20
20

 

 

 

 

 

 

 

3、typedef 和 #define 的区别

typedef 是在编译过程中被解析的,而#define是在编译之前的预处理阶段处理的#define只是对所定义的别名的简单替换,而typedef可以做到#define能做到的所有事情,而且可以做得更好

(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;
typedef int * PTR_INT
PTR_INT p1, p2;           //int *p1, *p2;

 

posted @ 2021-05-15 22:11  我是二狗  阅读(481)  评论(0编辑  收藏  举报