实现一维动态数组的基本步骤为:①定义合适数据类型的一级指针变量。③将动态分配存储区域的首地址转换为所需要的指针形式赋值给对应的指针变量。④将指针变量名作为一维数组名操作。为了模拟数据,程序中仍然要求被排序数组用随机函数生成。例8.18的程序除了被处理的数组是动态创建的之外,程序的功能和结构在第4章中已经进行了讨论,请读者参照第4章的知识自行分析。使用动态一维数组时,需要注意和直接定义一维数组之间的差异。......
2023-11-20
将一维数组(包括字符数组)看成一个整体作为函数参数时,用数组名作为函数的形式参数或实际参数。如前所述,数组在存储时有序地占用一片连续的内存区域,数组的名字表示这段存储区域的首地址。用数组名作为函数参数实现的是“传地址值调用”,其本质是在函数调用期间实际参数数组将它的全部存储区域或者部分存储区域提供给形式参数数组共享,即形参数组与实参数组是同一存储区域或者形参数组是实参数组存储区域的一部分。直观地说,就是同一个数组在主调函数和被调函数中有两个不同(甚至相同)的名字。
如果需要把整个实参数组传递给被调函数中的形参数组,可以使用实参数组的名字或者实参数组第一个元素(0号元素)的地址(参见图6.8)。
一维数组作为函数的形式参数本质上是一个指针变量,所以在描述上不需要指定形参数组的长度。
图6.8 数组存储区域全部共享时形参数组与实参数组的关系
【例6.13】 编写求和函数并通过该函数求数组的元素值和。
上面程序中函数sum的原型为:int sum(int v[],int n);,表示了该函数在被调用时应该传递一个整型数组给一维数组形式参数v[],数组的长度由整型变量n表示,函数sum的功能是将用形式参数v表示的长度为n的数组元素求和。主函数通过函数调用表达式sum(a,N)调用函数sum,调用时将数组名作为实际参数(也可以用&a[0]作为实际参数)传递给函数sum的形参数组v。数组v本质上是一个指针变量,通过参数传递获取了主调函数中数组a的首地址,从而可以操作a数组,可以认为形式参数v就是实际参数a数组在函数sum中的另外一个名字,在sum函数中操作v数组实质上就是操作主调函数中的a数组,程序执行的结果为:total=55。
函数调用时用数组的某一个元素地址值作为实际参数传递给形式参数数组,可以实现将实参数组自某一元素开始后面所有的区域提供给形参数组共享的目的(参见图6.9),下面的例6.14程序展示了这种用法。
图6.9 数组存储区域部分共享时形参数组与实参数组的关系
【例6.14】 编写求和函数并通过该函数求数组自某一元素后的所有元素值和,起始点元素序号从键盘上输入。
比较例6.14和例6.13的程序,可以发现函数sum没有任何改变,程序中有所改变的是主调函数中的调用表达式:sum(&a[pos],N-pos),其中,参数&a[pos]表示将数组a自a[pos]元素以后的元素全部提供给形参数组共享,N-pos是传递到函数add中共享的数组元素个数,请读者结合图6.9自行分析程序运行方式。(www.chuimin.cn)
在前面章节关于函数的讨论中我们知道,一个函数通过其返回机制仅能返回一个值。如果期望通过一个函数的执行能够获取多个数据,就需要使用指针参数来达到目的。如果需要通过函数执行获取的数据非常多,势必造成函数的参数表十分臃肿。这种情况下,通过数组参数可以大大简化程序的设计。下面的例6.15展示了通过函数数组参数获取多个值的用法。
【例6.15】 反复从键盘上输入若干字符串(直到输入空串为止),统计所输入的字符串中每一个小写英文字母出现的次数。
在上面程序中,函数count使用了两个数组参数,其中s参数用于接收传递到函数中处理的字符串,c参数用于统计的实参数组counter。函数中,当判断一个字符s[i]是小写英文字母时,通过s[i]-'a'计算出对应的计数器(计数器数组元素)位置,将该计数器值增加1。
有关C语言程序设计基础(第3版)的文章
实现一维动态数组的基本步骤为:①定义合适数据类型的一级指针变量。③将动态分配存储区域的首地址转换为所需要的指针形式赋值给对应的指针变量。④将指针变量名作为一维数组名操作。为了模拟数据,程序中仍然要求被排序数组用随机函数生成。例8.18的程序除了被处理的数组是动态创建的之外,程序的功能和结构在第4章中已经进行了讨论,请读者参照第4章的知识自行分析。使用动态一维数组时,需要注意和直接定义一维数组之间的差异。......
2023-11-20
首先数组元素可以作为实参,其用法与变量完全相同。图5.5程序运行结果说明:用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例中array 是形参数组名,score 是实参数组名,分别在其所在函数中定义,不能只在一方定义。图5.8程序运行结果用数组名作为函数参数时应注意以下几点:形参数组和实参数组的类型必须一致。......
2023-10-21
图8.3用指针修改数组元素的值使用指针变量表示数组元素示例。另外,在输出数组值的操作中,首先让指针变量p指向数组0号元素,然后通过循环控制中的p++运算,使得指针变量p依次指向a数组的其他元素,通过*p的方式表达数组元素值。程序执行的结果为:0010000如果有两个指针变量分别指向同一个数组的两个不同元素,则两个指针变量之间的距离表示了它们之间的差距有多少个数组元素。......
2023-11-20
图5.3程序运行结果说明:定义函数时指定的形参变量在未出现函数调用时,并不占用内存的存储单元。图5.4程序运行结果说明:程序中实参与形参同名,但两者的作用范围不同,程序开始执行时,为主函数中的变量n分配存储空间,实参n 在主函数main()中有效;主函数调用函数s(),有效的是形参n。程序的运行结果表明,当函数调用时,实参的值传送给形参,在被调函数内部,形参的变化不会影响实参的值。......
2023-10-21
指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。图6.15程序运行结果从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。......
2023-10-21
而当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。本程序与例5.5程序相比,aver()函数的形参数组长度改为8,而在函数体中,for语句的循环条件也改为i<8。因此,形参数组a和实参数组sco的长度不一致。例5.7把例5.5程序中的函数的形参数组不指定长度,并改写程序。......
2023-11-18
指针变量既可以作为函数的形参,也可以作为函数的实参。所以,为了解决通过被调用函数来实现主调函数中变量值的改变,必须使用指针变量作为函数的形参。在执行被调用函数时,使形参指针变量所指向的变量的值发生变化。函数调用完成后,通过不变的实参指针变量将变化的值保留下来。图6.8程序运行结果说明:函数swap 的形参是两个整型指针变量p1 和p2,故主函数在调用时,必须使用变量a 和b 的地址,即&a 和&b 作为实参。......
2023-10-21
当指针变量指向一维数组的首元素时,称为指向了一维数组。所以,函数中一维数组形式参数可以用同类的指针形式参数替代;同理也可以用指向特定数组的指针变量来传递数组类实际参数。特别需要注意的是,函数的形式参数无论使用的是数组名形式还是指针变量形式,本质上都是一个指针变量,在被调函数中既可以将它当作数组名使用也可以将它当作指针变量使用。......
2023-11-20
相关推荐