首页 > 编程知识 正文

c语言函数作为参数,指针作为函数参数传递

时间:2023-05-03 14:27:16 阅读:107519 作者:4772

在以前的课程中,学习了c语言中指针变量和函数参数的概念和作用,但在实际的编程操作中经常将指针变量作为函数参数。 那么,如何将指针变量作为函数参数呢? 下一课将介绍如何将指针变量作为函数的参数。

众所周知,在c语言中,函数的自变量不仅可以是整数、小数、字符等具体数据,也可以是指向它们的指针。 您可以使用指针变量作为函数参数,将函数外部的地址传递到函数内部。 这样,可以在函数内部操作函数外部的数据,并且函数退出时不会丢弃数据。 数组、字符串、动态分配的内存等是一组数据,不能全部通过一个参数传递到函数内部。 传递那些指针,只能在函数内部通过指针影响那些数据集合。 在某些情况下,操作整数、小数和字符等基本类型数据时也可能需要使用指针。 一个典型的例子是交换两个变量的值,但在实际操作中,比较多的初学者容易出错。 以下是交换两个变量的值的示例。

#包含

voidswap(inta,intb ) {

内部; //临时变量

temp=a;

a=b;

b=temp;

}

intmain ()。

inta=66,b=99;

swap(a,b );

printf(a=%d,b=%d\n ',a,b );

返回0;

}

输出结果:

a=66,b=99

从结果可知,a、b的值没有变化,交换失败。 这是因为swap ) )函数内部的a,b和main ) )函数内部的a,b是不同的变量,占用不同的内存。 这些不仅名字一样,也没有其他关系。 swap ) )交换其内部的a、b的值,不影响其外部(main ) )内部的a、b的值。 实际上,使用指针变量作为参数可以很容易地解决上述问题

#包含

voidswap(int*P1,int*p2 ) {

内部; //临时变量

temp=*p1;

*p1=*p2;

*p2=temp;

}

intmain ()。

inta=66,b=99;

swap(a,b );

printf(a=%d,b=%d\n ',a,b );

返回0;

}

输出结果:

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 ) )。

#包含

intmax(int*intarr,intlen ) )

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

for(I=1; I

最大值

maxValue=intArr[i];

}

}

返回最大值;

}

intmain ()。

intnums[6],I,maxValue;

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

//读取用户输入的数据,并分配给数组元素

for(I=0; I

scanf('%d ',nums i );

}

打印f (max value is % d! n ',max(nums,len );

返回0;

}

输出结果:

12553089327

最大值is 93!

在这里,参数intArr只是一个数组指针,函数内部无法从该指针得到数组长度,必须将数组长度作为函数参数传递到函数内部。 数组nums的每个元素都是整数,当读取用户输入的整数时,scanf ()必须提供存储该整数的内存地址。 nums i是第I个数组元素的地址。 将数组用作函数参数时,也可以将参数作为“真”数组提供。 例如,上面的max ) )函数的情况下,可以将参数写为:

intmax(intintarr[6],intlen ) {

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

for(I=1; I

if(MAXV

alue

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语言起到一定的作用!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。