C语言学习笔记之 函数进阶

函数进阶

函数参数默认值

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 &num;
}

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
原文地址:https://www.cnblogs.com/zhujiangyu/p/13693900.html