伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

C语言指针变量作为函数参数的实现步骤详解

目录

    函数参数用数组作函数参数


函数参数

在C语言中,函数的参数不只可以是整数、小数、字符等详细的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传送到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的完毕而被销毁。
像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传送它们的指针,在函数内部通过指针来影响这些数据集合。
有的时候,对于整数、小数、字符等根本类型数据的操作也必需要借助指针,一个典型的例子就是交换两个变量的值。
有些初学者可能会使用下面的方法来交换两个变量的值:
#include<stdio.h>
voidswap(int a,int b){
int temp;//临时变量
    temp = a;
    a = b;
    b = temp;
}
intmain(){
int a =66, b =99;
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return0;
}运行结果:
a = 66, b = 99
从结果可以看出,a、b 的值并没有发生改变,交换失败。这是因为 swap() 函数内部的 a、b 和 main() 函数内部的 a、b 是不同的变量,占用不同的内存,它们除了名字一样,没有其他任何关系,swap() 交换的是它内部 a、b 的值,不会影响它外部(main() 内部) a、b 的值。
改用指针变量作参数后就很容易处置上面的问题:
#include<stdio.h>
voidswap(int*p1,int*p2){
int temp;//临时变量
    temp =*p1;
*p1 =*p2;
*p2 = temp;
}
intmain(){
int a =66, b =99;
swap(&a,&b);
printf("a = %d, b = %d\n", a, b);
return0;
}运行结果:
a = 99, b = 66
调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 *p1、*p2 代表的就是变量 a、b 自身,交换 *p1、*p2 的值也就是交换 a、b 的值。函数运行完毕后虽然会将 p1、p2 销毁,但它对外部 a、b 形成的影响是“耐久化”的,不会随着函数的完毕而“恢复原样”。
需要注意的是临时变量 temp,它的作用特别重要,因为执行*p1 = *p2;语句后 a 的值会被 b 的值覆盖,假设不先将 a 的值保管起来以后就找不到了。
这就好比拿来一瓶可乐和一瓶雪碧,要想把可乐倒进雪碧瓶、把雪碧倒进可乐瓶里面,就必需先找一个杯子,将两者之一先倒进杯子里面,再从杯子倒进瓶子里面。这里的杯子,就是一个“临时变量”,虽然只是倒倒手,但是也不可或缺。
C语言指针变量作为函数参数的实现步骤详解-1.jpg


用数组作函数参数

数组是一系列数据的集合,无法通过参数将它们一次性传送到函数内部,假设希望在函数内部操作数组,必需传送数组指针。下面的例子定义了一个函数 max(),用来查找数组中值最大的元素:
#include<stdio.h>
intmax(int*intArr,int len){
int i, maxValue = intArr[0];//假设第0个元素是最大值
for(i=1; i<len; i++){
if(maxValue < intArr){
            maxValue = intArr;
}
}
return maxValue;
}
intmain(){
int nums[6], i;
int len =sizeof(nums)/sizeof(int);
//读取用户输入的数据并赋值给数组元素
for(i=0; i<len; i++){
scanf("%d", nums+i);
}
printf("Max value is %d!\n",max(nums, len));
return0;
}运行结果:
12 55 30 8 93 27↙
Max value is 93!
参数 intArr 仅仅是一个数组指针,在函数内部无法通过这个指针获得数组长度,必需将数组长度作为函数参数传送到函数内部。数组 nums 的每个元素都是整数,scanf() 在读取用户输入的整数时,要求给出存储它的内存的地址,nums+i就是第 i 个数组元素的地址。
用数组做函数参数时,参数也可以以“真正”的数组形式给出。例如对于上面的 max() 函数,它的参数可以写成下面的形式:
intmax(int intArr[6],int len){
int i, maxValue = intArr[0];//假设第0个元素是最大值
for(i=1; i<len; i++){
if(maxValue < intArr){
            maxValue = intArr;
}
}
return maxValue;
}int intArr[6]仿佛定义了一个拥有 6 个元素的数组,调用 max() 时可以将数组的所有元素“一股脑”传送进来。
读者也可以省略数组长度,把形参简写为下面的形式:
intmax(int intArr[],int len){
int i, maxValue = intArr[0];//假设第0个元素是最大值
for(i=1; i<len; i++){
if(maxValue < intArr){
            maxValue = intArr;
}
}
return maxValue;
}int intArr[]虽然定义了一个数组,但没有指定数组长度,仿佛可以接受任意长度的数组。
实际上这两种形式的数组定义都是假象,不论是int intArr[6]还是int intArr[]都不会创建一个数组出来,编译器也不会为它们分配内存,实际的数组是不存在的,它们最终还是会转换为int *intArr这样的指针。这就意味着,两种形式都不能将数组的所有元素“一股脑”传送进来,大家还得规规矩矩使用数组指针。
int intArr[6]这种形式只能说明函数期望用户传送的数组有 6 个元素,并不意味着数组只能有 6 个元素,真正传送的数组可以有少于或多于 6 个的元素。
需要强调的是,不论使用哪种方式传送数组,都不能在函数内部求得数组长度,因为 intArr 仅仅是一个指针,而不是真正的数组,所以必需要额外增加一个参数来传送数组长度。
C语言为什么不允许直接传送数组的所有元素,而必需传送数组指针呢?
参数的传送实质上是一次赋值的过程,赋值就是对内存停止拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。
对于像 int、float、char 等根本类型的数据,它们占用的内存往往只要几个字节,对它们停止内存拷贝非常快速。而数组是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们停止内存拷贝有可能是一个漫长的过程,会严重拖慢程序的效率,为了防止技艺不佳的程序员写出低效的代码,C语言没有从语法上支持数据集合的直接赋值。
除了C语言,C++、Java、Python 等其它语言也制止对大块内存停止拷贝,在底层都使用类似指针的方式来实现。
到此这篇关于C语言指针变量作为函数参数的实现步骤详解的文章就介绍到这了,更多相关C语言指针变量作为函数参数内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

梁梁
注册会员
主题 18
回复 15
粉丝 0
|网站地图
快速回复 返回顶部 返回列表