数组、函数预习

1.数组的下标总是从0开始吗?可以使用数组后面第一个元素的地址吗?

(1)是的,对数组a[MAX] (MAX 是一个编译时可知的值)来说,它的第一个和最后一个元素分别是a[0]和a[MAX-1]。在其他一些语言中,情况可能有所不同,例如,在BASIC 语言中数组a[MAX]的元素是从a[1]到a[MAX],在Pascal 语言中则两种方式都可行。
       注意: a[MAX]是一个有效的地址,但该地址中的值并不是数组a 的一个元系。

(2)可以使用数组后面第一个元素的地址,但你不可以查看该地址中的值。

2.数组作为参数传递给函数时,可以通过sizeof 得到数组的大小吗?指针或带下标的数组名都可以访问元素,哪一种更好?

(1)答案是不可以。当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种机制告诉函数数组参数的大小。

(2)与使用下标比,使用指针能使C编译程序更轻易地产生优质的代码。

3.可以把另外一个地址赋给一个数组名吗?

不可以,尽管在一个很常见的特例中好像可以这样做。数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。

4.array_name 和&array_name 有什么不同?

前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。

5.字符串和数组有什么不同?

数组的元素可以是任意一种类型,而字符串是一种特别的数组,它使用了一种众所周知的、确定长度的规则。

根据处理字符串的不同,语言可分为两种,一种是简单地将字符串看作一个字符数组,另一种是将字符串看作一种特别的类型。C语言属于前一种,但有一点补充,即C字符串是以一一个NUL字符结束的。数组的值和数组中第一个元素的地址(或指向该元素的指针) 是相同的,因此通常一个C 语言字符串和一个字符指针是等价的。

6.声明与定义有什么不同?

函数的声明就是声称一个函数的名字,只是说明函数的名字,不涉及函数的实现,即没有函数体,所以函数的声明只包括前三个部分。函数的定义就是确定一个函数的意义,即让函数具有某项功能,但是这里可不是只有函数体,你总要指明这个函数体是那个函数的吧,所以函数的定义包含了一个函数的所有部分。

7.形式参数与实际参数

函数在调用时把一些表达式作为参数传递给函数。函数定义中的参数是形式参数,函数的调用者提供给函数的参数是实际参数。在函数调用之前,实际参数的值将被复制到这些形式参数中。

8.回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

9.结构体数组作函数参数

用结构体数组作的数参数包含两类情况: 结构体数组元素作为实参和结构体数组名作为实参。两类情况仍然服从数据的单向值传递原则,只不过前者传给形爹的是某些变量的值,后者传给形参的是结构体数组的首地址。

(1)结构体数组元素作为实参
符合结构体变量作为实参规则,采取单向“值传递”方式将结构体变量所占的内存单元的内容全部顺序复制给形参(函数调用期间形参也要占用内存单元)。注意,当实参的成员中包含数组时,形参相应的成员接收到的是一一个地址。

(2)结构体数组名作为实参
同整型数组数组名作为实参一样,传递给形参的是内存中已指定单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,因此对形参数组的操作也就是对实参数组的操作,对数组的操作表现为双向性。

10.为什么用const说明的常量不能用来定义一个数组的初始大小?

并不是所有的常量都可以用来定义一个数组的初始大小,在C程序中,只有C语言的常量表达式才能用来定义一个数组的初始大小。然而,在C++中,情况有所不同。


一个常量表达式的值在程序运行期间是不变的,并且是编译程序能计算出来的一个值。在定义数组的大小时,你必须使用常量表达式,例如,你可以使用数字:
char a[512];
或者使用一个预定义的常量标识符:
#define MAX 512
/*... */
char a[MAX];
或者使用一个sizeof表达式:
char a[sizeof(structcacheObject)];
或者使用一个由常量表达式组成的表达式:
char buf[sizeof(struct cacheObject) *MAX];
或者使用枚举常量。
在C中,一个初始化了的constint变量并不是一个常量表达式:
int max=512; /* not a constant expression in C */
char buffer[max]; /* notvalid C */
然而,在C++中,用const int变量定义数组的大小是完全合法的,并且是C++所推荐的。尽管这会增加C++编译程序的负担(即跟踪const int变量的值),而C编译程序没有这种负担,但这也使C++摆脱了对C预处理程序的依赖。



























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值