C语言的数据类型
1.1、数据类型分类

注意:C语言里面没有bool(布尔)类型,C++里面才引入bool类型,C语言里面用数值0表示假,非0整数表示真(一般是1)

1.2、数据类型涉及的问题
  • 在语法上的表示形式
  • 在内存中的存储方式
  • 占用的内存空间大小
  • 相关的标准头文件
1.3、为什么需要数据类型?
  • 不同的数据占用内存大小不同,分开处理可以节约内存空间。
  • 数据结构不同,以便分类处理
1.4、给现有数据类型起个别名

除了可以直接使用C标准类型名(charshortintlongfloatdouble) 和开发者自己声明的structunionenum类型外,还可以使用typedef来给这些已有的类型名取一个别名, 然后我们就使用这个别名。为什么要这么做呢?通常基于下面这些原因:

1.4.1、使用统一类型,便于移植

比如整型分为了4种类型:shortintlonglong long, 标准并没有规定这些数据类型到底占用多少内存空间,只是规定了sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long), 具体占用多少内存空间由编译器决定。所以,为了便于移植程序,我们可以结合条件编译来定义统一的数据类型,示例:

#if __LP64__ || 0 || NS_BUILD_32_LIKE_64
    typedef long NSInteger;
    typedef unsigned long NSUInteger;
#else
    typedef int NSInteger;
    typedef unsigned int NSUInteger;
#endif
1.4.2、统一复杂类型入struct、union、enum等与基本类型的使用方式

在定义structunionenum等的时候,如果不使用typedef的话,我们总是要带上structunionenum等关键字,与基本类型的使用不统一,总显得格格不入, 使用typedef后就不用带上这些关键字了。

不使用typedef定义复杂类型示例:

struct Person {
    char name[10];
    int  age;
    char sex;
};

union XX {
    int  x;
    char y;
};

enum bool {
    false,
    true
};

int main() {
    struct Person person = {.name = "lifupin", .age = 18, .sex = 'F'};

    union XX xx;
    xx.x = 1;

    enum bool isOK = false;

    return 0;
}

使用typedef定义复杂类型示例:

typedef struct {
    char name[10];
    int  age;
    char sex;
} Person;

typedef union {
    int  x;
    char y;
} XX;

typedef enum {
    false,
    true
} bool;

int main() {
    Person person = {.name = "lifupin", .age = 18, .sex = 'F'};

    XX xx;
    xx.x = 1;

    bool isOK = false;

    return 0;
}
1.4.3、起一个更妥当的名字

C语言的语法中,没有String类型,我们通常用字符指针代表String类型,用String更妥当。

typedef char* String;

String str = "Hello";
1.4.4、定义函数指针类型

示例:

#include<stdio.h>

typedef void (*Callback)(int);

void callback(int x) {
    printf("x = %d\n", x);
}

int main() {
    Callback cb = callback;
    cb(2);
    return 0;
}

注意:

typedef只是对已经存在的数据类型设置一个别名,而没有创造新的数据类型

typedef#define有相似之处,但事实上二者是不同的,#define是在预编译时处理,它只能做简单的字符串替换, 而typedef是在编译时处理的。它并不是做简单的字符串替换,而是采用如同定义变量的方法那样来声明一个类型。

例如:typedef int COUNT;#define COUNT int的作用都是用COUNT代表int, 但事实上它们二者是不同的。