1. 程式人生 > 實用技巧 >C語言學習筆記之 函式進階

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\n",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\n",__func__,a);
}

int main()
{
	int a = 10;
	changevalue(a); // 普通變數做形參改變不了變數的值
	printf("%s:a = %d\n",__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\n",__func__,*a);
}

int main()
{
	int a = 10;
	changevalue(&a); // 如果想在函式內部改變外部變數的值,需傳入外部變數的地址
	printf("%s:a = %d\n",__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",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(" }\n");
		}
		else
		{
			printf(", ");
		}
		
	}
	
}

int main()
{
	int a[5];

	inputIntArray(a,5); // 向陣列輸入資料
	outputIntArray(a,5); // 列印陣列
	int max;
	maxInt(a,5,&max); // 求最大值
	printf("max = %d\n",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",n);
	fgets(arr, n, stdin);	
}

// 用於計算字串長度
int myStrlen(char *arr)
{
	int count = 0;
	while (arr[count] != '\0')
	{
		++count;
	}
	return count;	
}

// 用於將字串大寫變小寫
void changeCharArray(char *arr)
{
	int i = 0;
	while (arr[i] != '\0')
	{
		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個字元\n",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\n",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\n",s[i]);
	}

	printf("%c\n",*(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\n",argc);

	for (int i = 0; i < argc; ++i)
	{
		printf("argv[%d] = %s\n",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