aver函数C语⾔怎么⽤,C语⾔函数使⽤
⼀、函数基础知识
1、函数的声明
函数只能定义⼀次,但可以声明多次。建议在头⽂件中声明⽽在源⽂件定义。函数的声明和函数的定义⾮常类似,唯⼀的区别是函数的声明⽆须函数体,⽤⼀个分号替代即可。
2、函数的定义
函数包括以下部分:返回类型、函数名字、由0个或多个形参组成的列表以及函数体。
returntype  functionname (type parameter1,type parameter2…) {……}
函数的形参列表:函数的形参列表可以为空,但是不能省略。void f1()、voidf2(void)
3、形参的基础知识
形参和实参:实参是形参的初始值。第⼀个实参初始化第⼀个形参,第n个实参初始化第n个形参。
局部变量:形参和函数体内部定义的变量统称为局部变量,仅在函数的作⽤域内可见。
⾃动对象:把只存在于块执⾏期间的对象称为⾃动对象。形参是⼀种⾃动对象,所以函数⼀旦结束,形参也就被销毁。
局部静态变量:有时有必要令局部变量的⽣命周期贯穿函数调⽤及之后的时间。可以将局部变量定义成static从⽽获得这样的对象。局部静态对象在程序的执⾏路径第⼀次经过对象定义语句时初始化,并且直到程序终⽌才被销毁,在此期间即使对像所在的函数结束执⾏也不会对它有影响。
⼆、参数传递
1、函数传参的三种⽅式:传值传递、地址传递、引⽤传递
(1)传值传递
(1)传值传递即将实参的值拷贝给形参。形参和实参是两个相互独⽴的对象,各占⼀个独⽴的存储空间。
(2)形参的存储空间是函数被调⽤时才分配的,调⽤开始,系统为形参开辟⼀个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。
⽰例代码:
#include
void swap1(int x, inty)//定义中的x,y变量是swap函数的两个形参
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x=%d,y=%d\n", x, y);
}
int main()
{
int a = 2;
swap1(a, b);//a,b变量为swap函数的实际参数
printf("a=%d,b=%d", a, b);
return 0;
}
输出结果为:x=3,y=2; a=2,b=3
代码分析:a虽然赋值给x,但是a的值并没有改变,对x的任何修改都不会改变a的值。函数是通过赋值把a,b赋给x,y,这是⼀个隐含操作,我们不能把它显式的写出来,进⾏函数中变量的值进⾏交换时只是形参x,y的交换,并没有对实参进⾏真正交换,所以a,b值不变。
(2)地址传递
因为指针使我们可以间接地访问它所指的对象,所以通过指针可以修改它所指对象的值。
地址传递与值传递的不同在于,它把实参的存储地址传送给形参,使得形参指针和实参指针指向同⼀块地址。因此,被调⽤函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
⽰例代码:
void swap2(int *px, int*py)
{
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
printf("px=%d,py=%d\n", *px, *py);
}
int main()
{
int a = 2;
int b = 3;
swap2(&a, &b);/*调⽤了swap函数,同样也有隐含动作px=&a;py=&b;*/
printf("a=%d,b=%d", a, b);
return 0;
}
运⾏结果为px=3,py=2;a=3,b=2;
代码分析:有了两⾏隐含赋值操作,我们可以清晰的看出指针*px,*py是对变量a,b的值操作。函数⾥⾯对a和b的值进⾏了交换。这就是传址。
(3)引⽤传递
引⽤传递是以引⽤为参数,则既可以使得对形参的任何操作都能改变相应数据,⼜使函数调⽤⽅便。引⽤传递是在形参调⽤前加⼊引⽤运算符“&”。引⽤为实参的别名,和实参是同⼀个变量,则他们的值也相
同,该引⽤改变则它的实参也改变。
#include
void  swap3(int &x,int &y)
{
int tmp = x;
x = y;
y = tmp;
printf("x=%d,y=%d\n", x, y);
}
int main()
{
int a = 2;
int b = 3;
swap3(a, b);//调⽤⽅式与传值⼀样
printf("a=%d,b=%d", a, b);
system("pause");
return 0;
}
输出结果:x=3,y=2; a=3,b=2;
代码分析:我们看到该代码只与传值中swap函数定义不同,swap3中参数都加了取地址符号&,有了这个函数会将a,b分别替代了x,y,这样函数⾥⾯操作就是a,b本⾝了。
2、结论
(1)除⾮实参是具体数值(5等)或者实参和形参是相同的名字外,避免使⽤传值传递。
(2)当某种类型不⽀持拷贝时,函数只能通过引⽤形参访问该类型的对象。
(3) ⼀个函数只能返回⼀个值,然⽽有时候函数需要同时返回多个值,引⽤形参为我们⼀次返回多个结果提供了有效的途径。
三、数组形参
1、数组的两个特殊性质:
①不允许拷贝数组(arry1=arry2):因为不能拷贝数组,所以⽆法以值传递的⽅式使⽤数组参数。
②使⽤数组时会将其转换成指针:因为数组会被转换成指针,所以当为函数传递⼀个数组时,实际传递的是只想数组⾸元素的指针。
2、数组数据的传送
要确定⼀个⼀维数组只需要知道:⼀个是数组的⾸地址,另⼀个是数组的长度,这样就可以唯⼀地确定⼀个⼀维数组。因此,要想通过实参和形参将⼀个数组从主调函数传到被调函数,那么只需要传递这两个信息即可。
因为数组是连续存放的,只要知道数组的⾸地址和数组的长度就能到这个数组中所有的元素。对于⼀维数组来说,其数组名就表⽰⼀维数组的⾸地址。所以只需要传递数组名和数组长度这两个参数就可以将数组从主调函数传⼊被调函数中。
当数组名作为函数的实参时,形参列表中也应定义相应的数组(或⽤指针变量),且定义数组的类型必须与实参数组的类型⼀致,如果不⼀致就会出错。但形参中定义的数组⽆须指定数组的长度,⽽是再定义⼀个参数⽤于传递数组的长度。所以在传递实参的时候,数组名和数组长度也只能⽤两个参数分开传递,⽽不能写在⼀起。因为即使写在⼀起,系统在编译时也只是检查数组名,并不会检查数组长度。所以数组长度要额外定义⼀个变量进⾏传递。
当将数组从⼀个函数传到另⼀个函数中时,并不是将数组中所有的元素⼀个⼀个传过来(那样效率就太低了)。⽽是将能够唯⼀确定⼀个数组的信息传过来,即数组名(数组⾸地址)和数组长度。此时主调函数和被调函数操作的就是同⼀个数组。
数组名就是数组的⾸地址。因此在数组名作函数参数时所进⾏的传送只是地址的传送,也就是说把实参数组的⾸地址赋予形参数组名。形参数组名取得该⾸地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同⼀数组,共同拥有⼀段内存空间。
当⽤数组名作函数参数时,情况则不同。由于实际上形参和实参为同⼀数组,因此当形参数组发⽣变化
时,实参数组也随之变化。当然这种情况不能理解为发⽣了“双向”的值传递。但从实际情况来看,调⽤函数之后实参数组的值将由于形参数组值的变化⽽变化。
⼀般来数参数的传递是值传递,也就是说实参传给形参,形参发⽣改变时实参并不会改变,(单向)。但是数组在传递的时候是地址传递,只要形参发⽣了变化,实参也会发⽣变化(“双向”)。
3、管理指针形参
因为数组是以指针的形式传递给函数的,所以开始函数并不知道数组的确切⼤⼩,调⽤者应该为此提供⼀些额外的信息。管理指针形参有三种常⽤技术:
(1)使⽤标记指定数组长度
指要求数组本⾝包含⼀个结束字符。这种⽅法适⽤于有明显结束标记且该标记不会与普通数据混淆的情况,倒是对像int这样所有取值都是合法值的数据就不太有效了。
void printf(char *cp)
{
if(cp)        /*若数组不是⼀个空指针*/
while(*cp)  /*只要指针所指的字符不是空字符*/
cout<
}
(2)使⽤标准库规范
指传递指向数组⾸元素和尾后元素的指针。为了调⽤这个函数,需要定义两个指针:⼀个指向要输出的⾸元素,另⼀个指向尾元素的下⼀位置。
(3)显式传递⼀个表⽰数组⼤⼩的形参
指专门定义⼀个表⽰数组⼤⼩的形参。
# include
int AddArray(intarray[], int n);  //函数声明
int main(void)
{
inta[] = {1, 2, 3, 4, 5, 6, 7, 8};
/*数组所占内存总⼤⼩除以该数组中⼀个元素所占内存的⼤⼩, 从⽽得到数组元素的个数*/
int size = sizeof(a) / sizeof(a[0]);
printf("sum = %d\n", AddArray(a,size));
return 0;
}
int AddArray(intarray[], int n)  //形参数组中不需要写长度
{
int i, sum = 0;
for (i=0; i
{
sum += array[ i];
[ i]
}
return sum;
}
输出结果:sum=36
int test1(int *p)
{
for(int i=0;i<5;i++)
{
printf("%d",p[ i]); //我们在这⾥还可以⽤)*(p+i)来输出数组中的值[ i]
}
}
int test2(int a[])
{
for(int i=0;i<5;i++)
{
printf("%d",a[ i]);
[ i]
}
}
int main()
{
int a[5] = {1,2,3,4,5},*p;
p = a;
test1(p);
怎么给数组赋值test2(a);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。