C++学习:第二章C语言基础 - (十一)函数传参
1. 调用
方法与函数之间的调用成为值传递,只是单纯的复制值进行传递。
形参是函数调用放向函数传递数据用的。
在C语言中,如果方法的参数表是空的,说明参数表的类型和个数不定,因此可以传参
C语言中的数组传参方式
#include <stdio.h>
void print(int a[], int len)
{
}
int main(){
int a[5] = {1,2,3,4,5};
int b[6] = {11,22,33,44,55,66};
print(a,5);
print(b,6);
return 0;
}
这个例子说明形参数组和实参数组是同一个数组,因为这边传递的是地址
函数每次被调用形参都会被创建,初始化为实参。
2. 不定长参数
C语言中对不定参数的支持
以printf为例子,man函数定义可以发现
int printf(const char *format, …);
va_start、va_arg、va_end、va_list 用来处理不定长参数表
man va_start查看详情
我们可以这么写,第一个5代表在后面5个数中选最大
max(5,18,55,33,566,22)
max(“%d%d%d%d%d” ,18,55,33,566,22)
简化为:
int max(int n, …),下面这段代码介绍不定长的几个函数用法
#include <stdio.h>
#include <stdarg.h>
int max(int cnt, …){
va_list v;//保存可变长参数表,va_list是个类型
va_start(v, cnt);//用v保存cnt之后的那么参数表
int i;
int maxVal = va_arg(v, int);//从参数表中取出第一个int类型的参数
for(i=1; i<cnt; i++){
int data = va_arg(v, int);
if(data > manVal){
manVal = data;
}
}
va_end(v);//终止或者是释放可变长参数表
return maxVal;
}
int main(){
printf(“%d\n”,max(5,18,55,33,566,22));
return 0;
}
下面这段代码是说不定长函数在传参时需要注意的 类型提升问题 和 字符串数组的传参问题(就是一个地址)。
#include <stdio.h>
#include <stdarg.h>
int max(int cnt, …){
va_list v;//保存可变长参数表,va_list是个类型
va_start(v, cnt);//用v保存cnt之后的那么参数表
int i;
int maxVal = va_arg(v, int);//从参数表中取出第一个int类型的参数
for(i=1; i<cnt; i++){
int data = va_arg(v, int);
if(data > manVal){
manVal = data;
}
}
va_end(v);//终止或者是释放可变长参数表
return maxVal;
}
void printchar(int , cnt, …){
va_list v;
vs_start(v, cnt);
int i;
for(i=0; i<cnt; i++){
//这个地方应该是int 不是 char ,因为在传递过程中char 会被提升为 int,单数输出格式%c 不用修改。类似的还有 short 等。小于int 用int,小于double 用 double
//char short – int
//float -- double
printf(“%c”,va_arg(v, char));
}
printf(“\n”);
va_end(v);
}
void printstring(int , cnt, …){
va_list v;
va_start(v, cnt);
int i;
for(i=0; i<cnt; i++){
puts(va_arg(v, char*));//字符串就是一个char地址!注意
//printf(“%s\n”, va_arg(v, char*));//这两个写法是一样的
}
printf(“\n”);
va_end(v);
}
int main(){
printf(“%d\n”,max(5,18,55,33,566,22));
printchar(3, ‘a’, ‘vv, ‘tt’);
printstring(3, “hello”, “good”, “world”);
return 0;
}