C primer plus 读书笔记第十章

时间:2020-12-11 20:00:14

这一章的标题是数组和指针。指针是C语言的精髓所在,而数组的概念和指针又息息相关,所以放在一起讲。

1.数组

  主要内容有:1.1.数组初始化、1.2.指定初始化、1.3.数组赋值、1.4.数组边界、1.5.指定数组大小。

其中要注意的是,1.2中的C99新增的特性,可以指定某些元素进行初始化。

int arr[6] = {[5]=212};

  在该代码中,数组的最后一个元素初始化为212,其他为0。

  而1.3中要注意的是,C不支持把数组作为一个整体来赋值,这和Java、python都不一样,也不支持用花括号的列表形式进行赋值(初始化除外)。

2.多维数组

  本节没什么好讲的,基本和其他语言一样。

3.指针和数组

  指针可以说是C语言的精髓。它提供了一种用来使用地址的符号方法,能够让你类似于计算机底层的表达方式来表达自己的意愿,使得工作更高效。

flizny == &flizny[0]

  这个式子的意思是,数组名同时也是该数组首元素的地址。指针的数值就是它所指向的对象的地址。运算符*可以得到该指针所指向对象的数值。对指针加1就表示指针的值加上它所指向的对象的字节大小。所以下面等式成立。

dates + 2 == &date[2]
* (dates + 2) == dates[2]

4.函数、数组和指针

  这一节总结起来一句话:int sum(int arr[])和int sum(int *arr)等价。

5.指针操作

  8种基本操作:赋值——把一个地址赋值给指针,不过通常用数组名或者地址运算符&来进行地址赋值;求值——运算符*取出指针指向地址中存储的数值;取指针地址——运算符&得到存储指针本事的地址;将一个整数加给指针——运算符+,返回地址;增加指针的值——运算符+或++,返回值;从指针中减去一个整数——同上上;减少指针的值——同上上;求差值——求指针直接的差值,返回单位是相应类型的大小;比较——关系运算符比较两个指针的值。

  这里特别特别要注意的是,不能对未初始化的指针取值。

int *pt; //未初始化的指针
*pt = 5; //一个可怕的错误

  这段代码的第二行表示把数值5存储在pt所指向的地址。但是pt并没有被初始化,因此它的值是随机的,不知道5会被存储在哪个位置。这个位置也许对系统危害不大,但也许会覆盖程序数据或者代码,导致程序崩溃。原因是,当创建一个指针时,系统只分配了这个指针本身的内存空间,而没有分配用来存储数据的内存空间。因此在使用指针之前,必须给它赋予一个已经分配的内存地址,或者使用malloc()函数来先分配内存。

6.保护数组内容

  假如函数直接使用指针,那么这个函数能直接使用和改变原始数据。当我们不想改变数组内容的时候,我们可以对形参使用const。

7.指针和多维数组

  书上写的有点绕,其实把前面的东西理解透了,自己多思考还是很好理解的。下图说明一切关系。

C primer plus 读书笔记第十章

8.变长数组

  C99引入变长数组,所谓的“变”是在创建数组前,创建数组后大小还是不变的。

练习题比较简单,基本上理解了指针遍历就能搞定大多数题目。