《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专家编程》读书笔记的主要内容,如果未能解决你的问题,请参考以下文章