函数进阶
函数参数默认值
C语言不支持设置函数默认参数
#define _CRT_SECURE_NO_WARNINGS
int test(int a = 0,int b)
{
return a + b;
}
int main()
{
test(1,2);
return 0;
}
报错:
PS D:>gcc main.c -o main
main.c:3:17: error: expected ';', ',' or ')' before '=' token
void test(int a = 0,int b)
^
main.c: In function 'main':
main.c:10:2: warning: implicit declaration of function 'test' [-Wimplicit-function-declaration]
test(1,2);
^
可以通过宏来实现默认参数
例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define Default(arg1,arg2) ((#arg1[0])?arg1:arg2)
// #arg1表示在arg1两端加上""
void _print(char *s)
{
printf("%s
",s);
}
#define print(s) _print(Default(s,"Hello world"))
int main()
{
print("abc");
print();
return 0;
}
运行结果:
D:>gcc main.c -o main
main.c: In function 'main':
main.c:3:44: warning: pointer/integer type mismatch in conditional expression
#define Default(arg1,arg2) ((#arg1[0])?arg1:arg2)
^
main.c:9:25: note: in expansion of macro 'Default'
#define print(s) _print(Default(s,"Hello world"))
^
main.c:14:2: note: in expansion of macro 'print'
print();
^
PS D:> ./main
abc
Hello world
指针作为函数的参数
案例1:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void changevalue(int a)
{
a = 100; // 这里的a是局部变量,函数执行结束就释放
printf("%s:a = %d
",__func__,a);
}
int main()
{
int a = 10;
changevalue(a); // 普通变量做形参改变不了变量的值
printf("%s:a = %d
",__func__,a);
return 0;
}
运行结果:
changevalue:a = 100
main:a = 10
案例2:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void changevalue(int *a)
{
*a = 100; // 通过指针修改外部变量
printf("%s:*a = %d
",__func__,*a);
}
int main()
{
int a = 10;
changevalue(&a); // 如果想在函数内部改变外部变量的值,需传入外部变量的地址
printf("%s:a = %d
",__func__,a);
return 0;
}
运行结果:
changevalue:*a = 100
main:a = 100
数组名作为函数的参数
案例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 用于向数组输入数据
void inputIntArray(int *arr, int n)
{
printf("请输入%d个int数据:
",n);
for (int i = 0; i < n; ++i)
{
// scanf("%d",&arr[i]);
scanf("%d",arr + i);
// &arr[i] = &*(arr + i) = arr + i
}
}
// 用于求数组最大值
void maxInt(int *arr, int n, int *p_maxint)
{
for (int i = 0; i < n - 1; ++i)
{
if (arr[i] < arr[i + 1])
{
*p_maxint = arr[i + 1];
}
else
{
*p_maxint = arr[i];
}
}
}
// 用于打印数组
void outputIntArray(int *arr, int n)
{
printf("{ ");
for (int i = 0; i < n; ++i)
{
printf("%d",arr[i]);
if (i == (n - 1))
{
printf(" }
");
}
else
{
printf(", ");
}
}
}
int main()
{
int a[5];
inputIntArray(a,5); // 向数组输入数据
outputIntArray(a,5); // 打印数组
int max;
maxInt(a,5,&max); // 求最大值
printf("max = %d
",max);
return 0;
}
运行结果:
请输入5个int数据:
1
2
34
45
67
{ 1, 2, 34, 45, 67 }
max = 67
字符数组名作为函数参数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
// 用于向数组输入数据
void inputCharArray(char *arr, int n)
{
printf("请输入一个字符串,长度小于%d:
",n);
fgets(arr, n, stdin);
}
// 用于计算字符串长度
int myStrlen(char *arr)
{
int count = 0;
while (arr[count] != ' ')
{
++count;
}
return count;
}
// 用于将字符串大写变小写
void changeCharArray(char *arr)
{
int i = 0;
while (arr[i] != ' ')
{
if (arr[i] >= 'a' && arr[i] <= 'z')
{
arr[i] -= 'a' - 'A';
}
else if (arr[i] >= 'A' && arr[i] <= 'Z')
{
arr[i] += 'a' - 'A';
}
++i;
}
}
int main()
{
char s[32];
inputCharArray(s,32);
s[strlen(s) - 1] = 0; // 用0去掉结尾的回车
printf("您输入的是:");
puts(s);
printf("您输入了%d个字符
",myStrlen(s));
changeCharArray(s);
printf("变换大小写:");
puts(s);
return 0;
}
运行结果:
请输入一个字符串,长度小于32:
abcDb@@!!BBBcBBSDc
您输入的是:abcDb@@!!BBBcBBSDc
您输入了18个字符
变换大小写:ABCdB@@!!bbbCbbsdC
指针作为函数返回类型
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int num = 0; // 全局变量
int* getIntaddr(void)
{
return #
}
int main()
{
int *p = NULL;
p = getIntaddr();
*p = 100; // *p = *(&num) = num
printf("num = %d
",num);
return 0;
}
运行结果:
num = 100
字符指针数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char *s[3] = {"Hello world","你好,世界","안녕, 세상."};
for (int i = 0; i < 3; ++i)
{
printf("%s
",s[i]);
}
printf("%c
",*(s[0] + 4));
return 0;
}
Hello world
你好,世界
안녕, 세상.
o
主函数传参
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("argc = %d
",argc);
for (int i = 0; i < argc; ++i)
{
printf("argv[%d] = %s
",i,argv[i]);
}
return 0;
}
PS D:> ./main -int 0 -chat a argc = 5
argv[0] = D:main.exe
argv[1] = -int
argv[2] = 0
argv[3] = -chat
argv[4] = a