第三章
恐怖的C语言声明语法
“C语言声明的形式和使用的形式相似”,例如:一个int类型的指针数组被声明为int *p[]; ,并且以*p[i]这样的表达式引用或者使用指针所指向的数据
C语言的声明所存在的最大问题是你无法以一种人们所习惯的自然方式从左到右阅读一个声明。
const int * grape;//1
int const * grape;//2
int *const grape_jelly;//3
1、2都是指针所指向的对象只读。而3是指针只读。
const int * const grape_jam;//4
int const * const grape_jam;//5
4、5都是指针和指针所指向的对象同时不可更改。
结构 联合 枚举
结构和联合的区别:在结构中,每个成员依次存储,而在联合中,所有的成员都从偏移地址零开始存储。这样,每个成员的地址都重叠在一起,只有一个成员真正存储于该地址。
·typedef 为现有类型取一个新名字。一般来说,typedef用于简洁表示指向其他东西的指针,可以将一长串的类型表达其他名字。
p67有不懂的地方 函数指针 ,利用函数本身做参数。 typedef应该用在 数组、结构、指针以及函数的组合类型。
第四章
数组和指针并不相同
定义(Definition)和声明(Declaration)的区别:
定义只能出现一个地方,作用是确定对象的类型并且分配内存,用于创建新的对象,例如int ma_array[100];
声明可以多次出现,作用是描述对象类型,用于指代其他地方定义的对象。例如extern int ma_array[];
区别一:在内存中对数据的访问
数组访问是 直接对数组首地址取偏移,偏移后的地址里存放的即为数据内容
指针访问是 取指针中的内容,该内容代表一个地址,该地址中存放的数据即表示数据内容(间接引用)
指针 | 数组 |
保存数据的地址 | 保存数据 |
间接访问数据 | 直接访问数据 |
通常用于动态数据结构 | 隐式分配内存 |
相关函数为malloc(), free() | 隐式的分配和删除 |
通常指向匿名数据 | 自身为数据名 |