指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。图6.15程序运行结果从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。......
2023-10-21
指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。
如果修改指针所指向的目标,能使函数带回多个值,而修改指针本身,不能使函数带回多个值。下面以交换两个整数为例进行说明。
【例6.11】交换两个整数——指针与函数。
程序运行结果如图6.15 所示。
图6.15 程序运行结果
从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。下面结合swap 函数,采用图示法进一步说明传值和传址这一重要的基本概念。
传值是单向传递,即将实参的值传递给对应的形参,而不可能将形参的值反传递给实参。传递结束,实参和形参不存在任何联系,因此,形参值的修改不会影响实参值,如图6.16 所示。形象地显示出:形参x、y 的值进行了交换。但是,由于形参x、y 的值不能修改实参x、y 的值,所以实参x、y 的值保持原值。
图6.16 传值
(www.chuimin.cn)
传址(传地址值)是将实参的地址传递给对应的形参,实现了形参共享实参,即形参x、y 指针所指向的目标就是实参x、y 存储单元。图6.17 显示出了形参共享实参概念。同时也显示出:形参x、y 的指针值进行了交换,即x 指针改为指向实参y,而y 指针改为指向实参x。但是,实参x、y 值没有被修改,仍保持原值。
图6.17 传址,修改指针
传址(传地址值),实现了形参共享实参。在swap3 函数中的下列语句:
是交换x、y 指针所指向的目标,即交换实参x、y 的值,且向调用函数传回两个值,如图6.18所示。
图6.18 传址,修改目标
从swap3(传址,修改目标)函数可以看出:通过指针类型形参,且修改它所指向的目标,可以使函数带回多个值。数组名是常量地址。因此,一维数组名和指针可相互传递(要注意,类型必须相同),如图6.19 所示。但是,二维数组名和指针不可相互传递。
图6.19 实参、形参
有关C语言程序设计实用教程的文章
指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。图6.15程序运行结果从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。......
2023-10-21
而当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。本程序与例5.5程序相比,aver()函数的形参数组长度改为8,而在函数体中,for语句的循环条件也改为i<8。因此,形参数组a和实参数组sco的长度不一致。例5.7把例5.5程序中的函数的形参数组不指定长度,并改写程序。......
2023-11-18
首先数组元素可以作为实参,其用法与变量完全相同。图5.5程序运行结果说明:用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例中array 是形参数组名,score 是实参数组名,分别在其所在函数中定义,不能只在一方定义。图5.8程序运行结果用数组名作为函数参数时应注意以下几点:形参数组和实参数组的类型必须一致。......
2023-10-21
取内容运算符*,又称间接引用运算符,结合性自右而左,用来表示指针变量所指的变量。指针变量定义时,“*”仅表示其后的变量是指针类型变量。图6.5指针的算术操作若设指针变量p 的值为2000,对于整型数据,其长度是2 个字节。然后,通过指针变量升序输出。图6.7指针变量p1 和p2 交换前后的指针方向......
2023-10-21
void类型指针中的数据不能访问,如果非要访问的话,可以通过强制转换将void类型指针转换为与所指向的数据类型相符的类型。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等。同理,如果是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。......
2023-11-18
图5.3程序运行结果说明:定义函数时指定的形参变量在未出现函数调用时,并不占用内存的存储单元。图5.4程序运行结果说明:程序中实参与形参同名,但两者的作用范围不同,程序开始执行时,为主函数中的变量n分配存储空间,实参n 在主函数main()中有效;主函数调用函数s(),有效的是形参n。程序的运行结果表明,当函数调用时,实参的值传送给形参,在被调函数内部,形参的变化不会影响实参的值。......
2023-10-21
对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。例7.11输入10个数,采用指针变量表示的地址法输入输出数组各元素。由于数组元素在内存是连续存放的,若给指向整型变量的指针传递数组的首地址,则该指针指向二维数组。#include<stdio.h>例7.16用指针法输入输出二维数组各元素。......
2023-11-18
一般来说,对于一个n(n>1)级指针变量其内容是存放一个n-1级指针变量的地址。虽然y和z都是指针变量,但它们指向的变量是不同的,显然不能用同一层次的指针变量来表示。图8.5多级指针在存储系统中的关系在C语言中,用指针变量的级别来区分不同层次的指针变量。指向普通变量的称为一级指针变量,指向一级指针变量的称为二级指针变量,以此类推。而且,只要数据类型相同,任意级别的指针变量可以与普通变量、数组等一起定义。......
2023-11-20
相关推荐