【C语言】函数传参
文章目录1、函数参数传递的三种方式1.1、值传递1.2、引用传递1.3、地址传递2、传递结构体3、传递数组3.1、数组做为参数传递3.2、不允许将数组做为返回值4、形参为空5、不定长参数表1、函数参数传递的三种方式1.1、值传递1.2、引用传递1.3、地址传递2、传递结构体3、传递数组3.1、数组做为参数传递数组做为函数的参数需要传递两个参数数组的地址数组的元素个数...
文章目录
1、函数参数传递的两种方式
1.1、值传递
#include <stdio.h>
/* 变量x、y为Swap函数的形式参数 */
void Swap(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n", x, y);
}
int main(void)
{
int a = 10;
int b = 20;
/*变量a、b为Swap函数的实际参数*/
Swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
输出:
x = 20, y = 10
a = 10, b = 20
1.2、地址传递
#include <stdio.h>
void Swap(int* px, int* py)
{
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d\n", *px, *py);
}
int main(void)
{
int a = 10;
int b = 20;
Swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
输出:
*px = 20, *py = 10
a = 20, b = 10
1.3、C中没有引用传递
如果在.C文件中出现函数参数为引用则出现莫名其妙的错误
void InsertSort(SqList &L);
报错error C2143: syntax error : missing ‘)’ before ‘&’
C++中才有引用传递,C中是没有引用传递的
2、传递结构体
3、传递数组
3.1、数组做为参数传递
- 数组做为函数的参数需要传递两个参数
- 数组的地址
- 数组的元素个数
#include <stdio.h>
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main()
{
int a[3]={1,2,3};
int b[5]={1,2,3,4,5};
print(a,3);
print(b,5);
return 0;
}
3.2、不允许将数组做为返回值
只需要向函数中传递数组,不需要返回数组。不允许也无意义。
因为函数中操作的形参数组值发生了改变,实参也会跟着变化。
#include <stdio.h>
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
void add(int a[],int n)
{
int i;
for(i=0;i<n;i++)
a[i]<<=1;
}
int main()
{
int a[5]={1,2,3,4,5};
print(a,5);
add(a,5);//对数组a里的值进行数值变化
print(a,5);//再输出数组a的值已发生了变化
return 0;
}
输出:
1 2 3 4 5
2 4 6 8 10
4、形参为空
- 形参为空表示,传参不定,可传可不传。
- 传什么值都能编译通过
#include <stdio.h>
#include <string.h>
char *getStr()//形参为空表示,传参不定,
{
return "Hello world";
}
int main()
{
char str[100]="";
strcpy(str,getStr(1,"aa"));
printf("%s\n",str);
return 0;
}
- 如果不允许传参,形参可以为void
char *getStr(void)
{
//... ...
}
5、不定长参数表
如C语言内置函数printf
int printf(const char *format,...);
5.1、不定长参数表的原理
不定长参数表依赖三个函数。这三个函数的头文件是<stdarg.h>,其实下面的三个函数都是一个宏定义(macro)。
这三个函数是:
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
5.2、va_list
va_list型的变量,这个变量是指向参数的指针
5.3、va_start
初始化定义的va_list变量,使其指向第一个可变参数的地址。
5.4、va_arg
返回可变参数,va_arg的第二个参数是你要返回的参数的类型(如果多个可变参数,依次调用va_arg获取各个参数)
- 第二个参数如果传char或short会被提升为int
- 第二个参数如果传float会被提升为double
5.5、va_end
结束可变参数的获取
5.6、不定长参数举例
例一:
#include <stdio.h>
#include <stdarg.h>
int max(int n, ...)
{
va_list v; //定义va_list变量
va_start(v, n); //使v指向第一个参数的地址
int i;
int maxvalue = va_arg(v, int);//获得第一个参数
for (i = 1; i < n; i++) {
int data = va_arg(v, int);//依次获取参数列表中的每个参数
if (data > maxvalue)
maxvalue = data;
}
va_end(v);
return maxvalue;
}
int main()
{
printf("%d\n", max(2, 2, 5));
printf("%d\n", max(3, 4, 1, 6));
return 0;
}
例二:
#include <stdio.h>
#include <stdarg.h>
void print(int n, ...)
{
va_list v;
va_start(v, n);
int i;
for (i = 0; i < n; i++)
{
puts(va_arg(v, char*));
}
va_end(v);
}
int main()
{
print(2, "hello", "word");
return 0;
}
输出:
hello
world
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)