1.1 C语言的两种类型:内建类型与用户自定义类型
(1)内建类型ADT、自定义类型UDT
ADT:编译器定义的原生类型(譬如int 、 double之类的)。
UDT: 不是语言自带而是程序员自己定义的(比如数组类型、结构体类型、函数类型......)。
1.2 typedef定义(或者叫重命名)类型而不是变量
(1)类型是一个数据模板,变量是一个是实在的数据。类型是不占内存的,而变量是占内存的。
(2)面向对象语言中:类型就是class,变量就是对象。
1.3 typedef与#define的区别
typedef char *pchar; (名在后)
#define pchar char * (名在前)
1.4 tepedef与结构体
(1) 结构体在使用时都是先定义结构体类型,再用结构体类型去定义变量。
#include <stdio.h>
//结构体类型的定义
struct student //只是定义了类型没有变量所以现在不耗内存
{
char name[20];
int age;
};
int main(void)
{
//结构体成员的使用
struct student s1; //struct student 是类型; s1是变量
s1.age = 12; //可以这样使用它
return 0;
}
(2) C语言语法规定,结构体类型使用时必须时struct 结构体类型名 结构体变量名 ;这样的方式来定义变量。
#include <stdio.h>
//定义了一个结构体类型,这个类型有两个名字:第一个名字是struct student,第二个类型名叫student_t
typedef struct student
{
char neme[20];
int age;
} student_t;
int main(void)
{
struct student s1; //可用上面已经验证过了
s1.age = 12;
student_t s2; //编译不报错不警告
return 0;
}
(3) 使用teppedef 一次定义两个类型,分别是结构体变量类型,和结构体变量指针类型。
#include <stdio.h>
//一次定义了两个类型
//第一个是结构体类型,有两个名字:struct teacher ,teachar
//第二个是结构体指针类型,有两个名字 struct teachar *, pTeacher
typedef struct teachar
{
char name[20];
int age;
int mager;
}teacher, *pTeacher;
int main(void)
{
teacher t1;
t1.age = 12;
pTeachar p1 = &t1;
printf("teacher age = %d\n",p1->age);
return 0;
}
1.5 typedef与const
(1) typedef int *PINT; const PINT p2; 相当于是 int * const p2;
#include <stdio.h>
typedef int *PINT;
// comst int *p 和 int *const p 是不同的。前者是p指向的变量是const,后者是p本身const
int main(void)
{
int a = 12;
int b = 45;
PINT p1 = &a;
const PINT p2 = &a; //按逻辑来说展开的应该是 const int *P2 那么理论上来说p2指向的变
//量是const的
*p2 = 24; //但是通过指针解引用来改变a的值这行代码在编译器那变是没警告没错
printf("a = %d\n",a); //打印输出结果是24,证明p2指向的变量的值其实是可以改变的
//那就是其实展开应该是 int * const p2
//为了验证猜想
p2 = &b; //将p2指向变量b //编译器运行程序会报错“assignment of read-only variable
//‘p2’” 提示p2是只读表示不可改变
return 0;
}
(2) typedef int *PINT; PINT const p2; 相当于是 int * const p2;
#include <stdio.h>
typedef int *PINT;
int main(void)
{
int a = 12;
int b = 45;
PINT p1 = &a;
printf("a = %d\n",a);
PINT const p2= &a;
*p2 = 24;
printf("a = %d\n",a);
//p2 = &b; //还是p2只读
return 0;
}
(3) 如果要想得到const int *p;这种效果,只能typedef const int *CPINT;CPINT P1;
1.6 使用typedef的重要意义(两个:简化类型、创造平台无关类型)
(1)简化类型的描述
char *(*) (char *, char *); typedef char *(*pfunc) (char *,char *);
(2)很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器是16位的,在32位机器上就是32位的)。为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术
内核中先定义:typedef int size_t;
然后再特定的编码需要下用size_t来替代int (譬如可能还有typedef int len_t)
要将程序移值平台的话(譬如16移值32)只需要更改自定义类型 而不需要去代码中大量查找以及修改节省时间
(3)stm32的库中全部使用了自定义类型,譬如typedef volatile unsigned int vu32;