zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    细思极恐-你真的会写java吗?
    java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)
    java并发编程之volatile
    细思极恐-你真的会写java吗?
    细思极恐-你真的会写java吗?
    细思极恐-你真的会写java吗
    1月中旬值得一读的10本技术新书(机器学习、Java、大数据等)!
    0基础小白怎么学好Java?
    java日常知识点积累
    (解决)ECSHOP info: Can't Connect MySQL Server(localhost:3306)!转删
  • 原文地址:https://www.cnblogs.com/zhujiangyu/p/13693900.html
Copyright © 2011-2022 走看看