第8章 数组
- 1.数组与指针的区别:
- 数组具有确定数量的元素,指针只是一个标量值
- 编译器用数组名来记住这些属性,当数组名在表达式中使用时,编译器会为它产生一个指针常量。
- 数组名就是一个指针常量
- 声明一个数组时,它同时也分配了一些内存空间,用于容纳数组元素。但是声明一个指针,它只分配了用于容纳指针本身的空间。
- 数值形参既可以声明数组也可以声明指针,但只有他们作为函数的形参才是相等的。
- 在下标【】引用中存在这乘法计算。
- 函数中数组的形参是个指针,在传递过程中年,它实际传递的只是指向数组第一个元素的指针
- int strlen(char *string)
- int strlen(char string[])
- 当用于初始化一个字符串数组时,他就是一个初始化列表,在其他任何地方,它都表示一个字符串常量
- 初始化:char message1[]="hello";
- 字符串常量: char *message="hello";
- 多维数组与一维数组的区别在于:多维数组第一维的元素实际上是另一个数组。多维数组的每个元素本身是另一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值。
- 数组名的值是指向数组第一个元素的指针,这个规则有两个例外:
- sizeof返回整个数组所占用的字节而不是一个指针占用的字节
- 单目操作符&返回一个指向数组的指针(不一定是第一个)
- 指针数组:指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型
- 数组指针:数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。
-
- 解答:
2.不一样,第二个改成(i+j)array ,原式中i+j[array]==array[j]+i
3.赋值是非法的,因为它试图计算的指针不在数组的左端;因此,应该避免使用这种技术。不过,它在大多数机器上都能工作。
4.char *front,*rear front=buffer rear=buffer+strlen(buffer)-1
5.通常一个程序80%的运行时间用于执行20%的代码,所以其他80%的代码语句对效率并不是特别敏感,使用指针所获得的效率上的提高抵不上其他方面的损失。
6.这要看是什么机器。针对80x86家族的Borland c++产生的结果与文中显示的68000代码类似。一些RISC机器已经证明使用try1比使用try5生成更好的代码;这是因为RISC体系结构没有实现*x++表达式所使用的奇特寻址模式。
7.这完全取决于所使用的特定机器和编译器。
- 解答:
-
- 解答:
8.指针与数组虽然有关联,但绝不是相同的
9. int coin_values[] = { 1 , 5 , 1 0 , 2 5 , 5 0 , 1 0 0 };
- 解答:
-
- 初始化一个数组、读取、写入超过一个的数组元素。
-
- 14.不会,但是表示的是array[4]
- 15.第二种更有意义。如果which超出了范围,使用它作为下标可能会使程序崩溃。
- 16.有几个不同点。作为一个参数,array1实际上是一个指针变量;它指向作为实际参数传递的数组,它的值可以由函数更改。在这个函数中没有为这个数组分配空间,也不能保证实际传递的参数有10个元素。另一方面,array2是一个指针常量,所以它的值不能更改。它指向函数中为10个整数分配的空间
- 17. 第一个参数是个标量,所以函数得到值的一份副本。对这份副本的修改并不会影响原先的参数,所以const关键字的作用并不是返回值原先参数被修改。第2个参数实际上是一个指向整型的指针。传递给函数的指针,传递给函数是指针的副本,对它进行修改并不会影响指针参数本身,但函数可以通过指针执行间接操作修改调用程序的值。const关键字是为了防止这种情况。
- 18.1)void function(int [][2][5]) 2)void function(int (*array)[2][5])
- 19. for( kwp = keyword_table; **kwp != ’\0’; kwp++ )