数组与函数 预习

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

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

注意: a[MAX]是一个有效的地址,但该地址中的值并不是数组a 的一个元系。

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

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

3.void printMany(char *strings[])

      {

      Int i;

  I = 0;

  While(strings[i] = NULL)

  {

       Puts(strings[i]);

   ++i;

  }

}

 

void printMany(char *strings[])

{

  While(*strings)

  {

       Puts(*strings++);

  }

}

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

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

5.机构体数组名作为实参

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

综上所述,在有参函数的调用时,实参变量与形参变量之间的数据都是单向“值传递”方式。至于调用过程中是否会改变主调函数中变量的值,则只需根据具体算法看被调函数是否会找到主调函数中变量所在内存单元并对其原本进行操作。

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

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

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

7、可以使用数组后面第一个元素的地址吗

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

如:int i,  a[MAX],  j;

那么i 和j都有可能存放在数组a最后一个元素后面的地址中。为了判定跟在数组a后面的是i还是j,你可以把i或j的地址和

数组a后面的地址进行比较即判定“&i == &a[MAX]”或“&j == &a[MAX]”是否为真。这种方法通常可行,但不能

保证

8、array_name和&array_name有什么不同

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

9、数组名作函数参数

数组名本身是一个特殊的指针变量,其值是数组的首地址,因此作为实参时其传给形参的是内存中某指定单元的地址,

调用过程中形参数组占用同一段内存单元,因此对形参数组的操作也就是对实参数组的操作,对实参数组与形参数组来说

数据传递表现为“双向”的,而对实参变量与形参变量而言数据的传递仍然是单向的。

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

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

一个常量表达式的值在程序的值在程序运行期间是不变的,并且是编译程序能计算出来的一个值。在定义数组的大小时,你必须使用常量表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值