C和指针(笔记+习题答案)

第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++ )
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值