C语言指针变量为函数参数,如何将指针变量作为函数参数

在之前的讲习中我们学习了C语言中的指针变量以及函数参数的概念和作用,在实际的编程操作中往往会用到将指针变量作为函数参数的情况,那么究竟怎样把指针变量作为函数参数呢?下面课课家笔者就为大家讲解如何将指针变量作为函数参数的方法。

5e45cf34b83d76234181d7ae9da323d5.png

众所周知,在C语言中函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值,但在实际操作中,比较多的初学者容易出现错误,下面笔者举个反面的代码例子来演示交换两个变量的值:

#include

voidswap(inta,intb){

inttemp;//临时变量

temp=a;

a=b;

b=temp;

}

intmain(){

inta=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

voidswap(int*p1,int*p2){

inttemp;//临时变量

temp=*p1;

*p1=*p2;

*p2=temp;

}

intmain(){

inta=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的值保存起来以后就找不到了。

◎用数组作函数参数

数组是一系列数据的集合,无法通过参数将它们一次性传递到函数内部,如果希望在函数内部操作数组,必须传递数组指针。下面的例子定义了一个函数max(),用来查找数组中值最大的元素:

#include

intmax(int*intArr,intlen){

inti,maxValue=intArr[0];//假设第0个元素是最大值

for(i=1;i

if(maxValue

maxValue=intArr[i];

}

}

returnmaxValue;

}

intmain(){

intnums[6],i,maxValue;

intlen=sizeof(nums)/sizeof(int);

//读取用户输入的数据并赋值给数组元素

for(i=0;i

scanf("%d",nums+i);

}

printf("Maxvalueis%d!\\n",max(nums,len));

return0;

}

输出结果:

12553089327↙

Maxvalueis93!

在这里参数intArr仅仅是一个数组指针,在函数内部无法通过这个指针获得数组长度,必须将数组长度作为函数参数传递到函数内部。数组nums的每个元素都是整数,scanf()在读取用户输入的整数时,要求给出存储它的内存的地址,nums+i就是第i个数组元素的地址。用数组做函数参数时,参数也能够以“真正”的数组形式给出。比如对于上面的max()函数,它的参数可以写成下面的形式:

intmax(intintArr[6],intlen){

inti,maxValue=intArr[0];//假设第0个元素是最大值

for(i=1;i

if(maxValue

maxValue=intArr[i];

}

}

returnmaxValue;

}

intintArr[6]好像定义了一个拥有6个元素的数组,调用max()时可以将数组的所有元素一下子传递进来。另外大家也可以省略数组长度,把形参简写为下面的形式:

intmax(intintArr[],intlen){

inti,maxValue=intArr[0];//假设第0个元素是最大值

for(i=1;i

if(maxValue

maxValue=intArr[i];

}

}

returnmaxValue;

}

intintArr[]虽然定义了一个数组,但没有指定数组长度,表面上似乎可以接受任意长度的数组,但实际上这两种形式的数组定义都是假象,不管是intintArr[6]还是intintArr[]都不会创建一个数组出来,编译器也不会为它们分配内存,实际的数组是不存在的,它们最终还是会转换为int*intArr这样的指针。这就意味着两种形式都不能将数组的所有元素一下子传递进来,大家还得按规矩使用数组指针。intintArr[6]这种形式只能说明函数期望用户传递的数组有6个元素,并不意味着数组只能有6个元素,真正传递的数组可以有少于或多于6个的元素。在这里笔者需要强调的是,不管使用哪种方式传递数组,都不能在函数内部求得数组长度,因为intArr仅仅是一个指针,而不是真正的数组,所以必须要额外增加一个参数来传递数组长度。或许有人会问C语言为什么不允许直接传递数组的所有元素,而必须传递数组指针呢?其实道理很简单,参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。对于像int、float、char等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们进行内存拷贝有可能是一个漫长的过程,会严重拖慢程序的效率,为了防止技术不到家的程序员写出低效的代码,C语言没有从语法上支持数据集合的直接赋值。除了C语言,C++、java、Python等其它语言也禁止对大块内存进行拷贝,在底层都使用类似指针的方式来实现。

本次如何将指针变量作为函数参数的讲解到此暂告一段落,如果以后有什么补充或者修改的话笔者会在此继续补充或者修改,同时也欢迎大家对本次的讲解提出建议和补充。最后希望本次的讲解能对大家学习C语言起到一定的作用!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值