《C专家编程》读书笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C专家编程》读书笔记相关的知识,希望对你有一定的参考价值。

九、“再论数组”

1. 数组和指针等同的情况:

(1) 表达式中的数组名被编译器当作一个指向该数组第一个元素的指针。

     类似加法,取下标操作符的操作数是可以交换的,所以在一个a[10]的声明中使用a[6]和6[a]都是正确的,因为编译器都将其解释为(a+6)。

(2) 数组下标总是与指针的偏移量相同。

(3) 在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。

     把作为参数的数组和指针等同起来是出于效率的考虑,毕竟传址调用比拷贝整个数组效率更高。注意此时在函数内部不能通过sizeof来获取数组长度,因为数组已转换为指针。

2. 数组名是不可修改的左值,而指针的值可以修改。

1 void func(int arr1[])
2 {
3     int arr2[] = {0,1,2};
4     int arr3[] = {0,1,2};
5     arr1 = arr2;  // ok, arr1 has been converted to a pointer.
6     arr3 = arr2;  // error, array‘s name is a left-value which can‘t be changed.
7 }

3. C语言中的数组就是一维数组,C语言的“多维数组”实际上是数组的数组。

4. 指针所指向的数组的维数不同,其自增操作的结果也不同。

1 int parrot[2][3][5];
2 int (*r)[5] = parrot[0];  // ++r将偏移4*5=20个字节
3 int *t = parrot[0][0];  // ++t将偏移4个字节

5. 对数组进行初始化时,如果数组的长度比所提供的初始化的个数要多,剩余的几个元素会被自动设置为0(若元素为int型)、空格(若元素为char型)、0.0(若元素为double型)、NULL(若元素为指针型).若声明数组时不提供任何初始值,则数组中的元素的值是未确定的。(在vc6.0环境下未初始化的int或指针取值均为0xcccccccc)。注意未初始化的指针的值并非NULL!

 

十、再论指针

1. “数组名被改写为一个指针参数”的规则并不是递归定义的,数组的数组会被编译器改写为“数组的指针”,而不是“指针的指针”。

1     实参                                      所匹配的形参
2 char c[8][10]; /*数组的数组*/            char (*c)[10]; /*数组指针*/ 
3 char *c[15];   /*指针数组*/              char **c;      /*指针的指针*/
4 char (*c)[64]; /*数组指针*/              char (*c)[64]; /*不改变*/
5 char **c;      /*指针的指针*/            char **c;      /*不改变*/

 

以上是关于《C专家编程》读书笔记的主要内容,如果未能解决你的问题,请参考以下文章

读书小笔记 (C和指针)

《代码大全》读书笔记——week4

C++Windows核心编程读书笔记

Java网络编程(读书笔记)

《c++游戏编程入门》读书笔记

简明python教程的读书笔记