C語言學習筆記之 函式進階
阿新 • • 發佈:2020-09-19
函式進階
函式引數預設值
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 #
}
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