一文搞懂C语言typedef关键字

一、typedef VS #define

在开始说明typedef关键字之前,我想先试着区分一下typedefdefine宏定义。例如:

/*#define 形式*/
#define COUNT int
/*typedef形式 */
typedef int COUNT;

typedef与**#define**有相似之处,上述两条语句的作用都是用COUNT代替int。但是事实上,他们二者是不同的。#define 是在预编译时处理的,它只能做简单的字符串替换,二typedef是在编译时处理的,实际上,它并不是作简单的字符串替换,而是采用如同定义变量的方法那样来声名一个类型。

  • 案例1:
/*使用typedef方式*/
typedef int COUNT,*PCOUNT;
int main()
{
    
    
    COUNT a = 520;
    PCOUNT b,c;
    b = &a;
    c = b;
    printf("address of a = %p\n",&a);
    printf("address of a = %p\n",b);
    printf("address of a = %p\n",c);
}
  • 案例2:
/*使用#define方式*/
#include <stdio.h>
#include <stdlib.h>
#define COUNT int
#define PCOUNT int*
int main()
{
    
    
  COUNT a = 520;
  PCOUNT b,c;
  b = &a;
  c = b;
  printf("address of a = %p\n",&a);
  return 0;
}

案例2虽然也能编译成功,但是会出现这样一个警告,大意就是b是指针变量,而c是一个int变量,两种不同类型的变量理论上是不能赋值的!
#define反例

  • 但为什么会出现警告呢?
  • 因为#define只是单纯地进行文本替换,所以PCOUNT<=>int*,PCOUNT b,c<=>int b,c*;是不是似曾相识,这不就是我们定义一个指针变量,一个int变量的写法吗!

二、基础typedef

废话不说,直接案例说明!

typedef为变量起别名

  • 案例3:
typedef int COUNT,*PCOUNT;
int main()
{
    
    
    COUNT a = 520;
    PCOUNT b,c;
    b = &a;
    c = b;
    printf("address of a = %p\n",&a);
    printf("address of a = %p\n",b);
    printf("address of a = %p\n",c);
}

typedef为结构体起别名

  • 案例4:
#include <stdio.h>
#include <stdlib.h>
typedef struct Date
{
    
    
    int year;
    int month;
    int day;
}DATE,*PDATE;

int main()
{
    
    
  PDATE time; // PDATE time<=>DATE* time<=>struct Date* time
  time = (PDATE)malloc(sizeof(DATE));
  printf("请输入年份:");
  scanf("%d",&time->year);
  printf("请输入月:");
  scanf("%d",&time->month);
  printf("请输入日:");
  scanf("%d",&time->day);
  printf("%d-%d-%d",time->year,time->month,time->day);
  return 0;
}

猜你喜欢

转载自blog.csdn.net/dongjinkun/article/details/105412559
今日推荐