一、函数形参–指针参数和数组参数的区别
- 作为函数形参的数组和指针可以互换
- 这种转换仅限于函数形参的声明
例子:以下3个声明是等价的
void putValues(int *);
void putValues(int[]);
void putValues(int[10]);
备注:数组长度不是参数类型的一部分。函数和编译器都不知道传统给它的数组的长度的大小。
- 传入指定长度数组的一种简便方法
二、默认参数值
- 默认参数值是一种在大多数情况下都适用的值。
- 函数声明可为全部或者部分参数提供默认值。
- 函数调用的实参按位置解析,默认参数只能用来替换函数调用缺少的尾部实参。
- 一个参数只能在一个文件里被指定一次默认实参。函数后续的声明中可以指定其他默认参数。可以在函数声明和定义处定义默认参数值。
- 默认参数可以用任意表达式指定。
例如:
---------------------ff1.h-----------------------------
intff(int a, int b,int c=0);
--------------------ff2.h------------------------------
#include “ff1.h”
intgetValue();
intff(int a, int b =getValue(), c);
--------------------ff2.cpp------------------------------
#include “ff2.h”
intff(int a=0, int b,int c)
{
}
三、 可选 形参
实现可选形参的步骤
1,包含头文件stdarg.h
2,使用va_start,va_end,va_arg来操作。va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。
例子:
---------------------- 1、演示如何使用参数个数可变的函数,采用ANSI标准形式----------------------
#include< stdio.h>
#include < string.h>
#include < stdarg.h>
/* 函数原型声明,至少需要一个确定的参数,
注意括号内的省略号 */
intdemo( char *, ... );
voidmain( void )
{
printf("%d",demo("DEMO","This", "is", "a", "demo!","/0"));
}
/*ANSI标准形式的声明方式,括号内的省略号表示可选参数*/
intdemo( char *msg, ...)
{
va_listargp;/*定义保存函数参数的结构*/
intargno= 0; /*纪录参数个数*/
char *para;/*存放取出的字符串参数*/
/*argp指向传入的第一个可选参数,
msg是最后一个确定的参数*/
va_start(argp,msg);
while(1) {
para =va_arg(argp,char *); /* 取出当前的参数,类型为char*. */
if ( strcmp(para,"/0") == 0 )
/* 采用空串指示参数输入结束*/
break;
printf("Parameter#%d is: %s/n",argno,para);
argno++;
}
va_end(argp); /*将argp置为NULL*/
return argno;
}
-------------------------------------------------------------------------------
-----------------------2 演示如何使用格式化参数----------------------------
#include< stdio.h>
#include < string.h>
#include < stdarg.h>
void demo( char *, ... );
voidmain( void )
{
demo(("There has %d string !"),1);
}
/*ANSI标准形式的声明方式,括号内的省略号表示可选参数*/
void demo( char *msg, ...)
{
va_listargp;/*定义保存函数参数的结构*/
intargno= 0; /*纪录参数个数*/
char para[255];/*存放取出的字符串参数*/
/* argp指向传入的第一个可选参数,
msg是最后一个确定的参数*/
va_start(argp,msg);
vsprintf(para,msg,argp); //把参数值写入字符串
printf("%s",para);
va_end(argp); /*将argp置为NULL*/
-------------------------------------------------------------------------