【黑馬程序員】C語言學習筆記之typedef(十五)


一、概念

給數據類型定義一個新的名字

二、使用

1、基本數據類型

#include <stdio.h>

typedef int Integer;    // 給int起一個新的名字Integer後,int能正常使用
typedef Integer Integer2;   // 在別名的基礎上,再給Integer起一個新的名字Integer2

int main()
{
    int i = 1;
    Integer i2 = 2;
    Integer2 i3 = 3;
    printf("%d, %d, %d\n", i, i2, i3);  // 輸出:1, 2, 3
    return 0;
}

2、指針

#include <stdio.h>

typedef char * String;    // 給char *起一個新的名字String

int main()
{
    String name = "hello";
    printf("%s\n", name);  // 輸出:hello
    return 0;
}

3、結構體

// 方式一
struct PersonType {
    char *name;
};
typedef struct PersonType Person;

// 方式二
typedef struct StudentType {
    char *name;
} Student;

// 方式三
typedef struct{
    char *name;
} Cat;

int main()
{
    // 方式一
    Person p = {"hello"};
    printf("%s\n", p.name);  // 輸出:hello
    
    // 方式二
    Student stu = {"world"};
    printf("%s\n", stu.name);  // 輸出:world
    
    // 方式三
    Cat cat = {"world"};
    printf("%s\n", cat.name);  // 輸出:world
    return 0;
}

4、指向結構體的指針

#include <stdio.h>

struct Person {
    char *name;
};

typedef struct Person * PersonPoint;

int main()
{
    struct Person p = {"hello"};
    PersonPoint pp = &p;
    pp->name = "world";
    printf("%s\n", p.name);
    return 0;
}

5、枚舉

#include <stdio.h>

/*
// 方式一
enum SexEnum {
    Man, Woman, Unknow
};

typedef enum SexEnum Sex;

// 方式二
typedef enum SexEnum {
    Man, Woman, Unknow
} Sex;
 */
 
// 方式三
typedef enum {
    Man, Woman, Unknow
} Sex;

int main()
{
    Sex sex = Man;
    printf("%d\n", sex);
    return 0;
}

6、指向函數的指針

#include <stdio.h>

int sum(int v1, int v2)
{
    return v1 + v2;
}

typedef int (*IntFunc)(int, int);

int main()
{
    IntFunc func = sum;
    printf("%d\n", func(3, 4));
    return 0;
}

三、#define與typedef

先看下面的代碼
#define String char *
typedef char * String2;

int main()
{
    String s1 = "hello";
    String2 s2 = "world";
    printf("%s, %s\n", s1, s2);
    return 0;
}
輸出:

hello, world

這段代碼大家都很容易理解,現在再看下面的代碼
#include <stdio.h>

#define String char *
typedef char * String2;

int main()
{
    String s1, s2;
    String2 s3, s4;
    return 0;
}
此時有什麼區別呢?讓我們來分析一下:
String s1, s2; 因爲String 是一個宏定義,編譯預處理的時候會直接替換掉,也就相當於char *s1, s2;再明白點就是char *s1; char s2; 這個可以通過sizeof得到證明,只有s1 是char *類型,s2是char 類型。
String2 s3, s4; typedef 是給類型起一個別名,所以就等於 char *s3; char *s4; 所以s3, s4都是char *類型的。






發佈了87 篇原創文章 · 獲贊 8 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章