zoukankan      html  css  js  c++  java
  • C语言学习12:带参数的main函数,无指定的函数形参,调用库函数处理无指定的函数形参,

    1,带参数的main函数

    #include <stdio.h> 
    
    int main(int argc,char *argv[]) 
    { 
        int i; 
        for(i=0;i<argc;i++) 
        { 
            puts(argv[i]); 
        } 
        return 0; 
    }

    结果:

    will@will-laptop:~/ex/11$ ./a.out 4 1 2 3 4 
    ./a.out 
    4 
    1 
    2 
    3 
    4

    2,无指定函数参数按地址进行输入

    #include <stdio.h> 
    
    void test (int a,...) 
    { 
        printf("paral,a:%d
    ",a); 
        printf("para2  :%s
    ",(char *)*(&a+1)); 
        //因为最后得到的是字符串的首地址,所以变成指针 
        printf("para3  : %lf
    ",*(double *)(&a+2)); 
        //后一个*号是把值定义为指针,前一个定义为取出地址的值 
        printf("para4  :%c
    ",*(&a+4)); 
        printf("para5  :%d
    ",*(&a+5)); 
    } 
    
    int main(void) 
    { 
        test(123,"hello",3.14,'a',567); 
        return  0; 
    }

    结果:

    will@will-laptop:~/ex/11$ ./a.out 
    paral,a:123 
    para2  :hello 
    para3  : 3.140000 
    para4  :a 
    para5  :567 

    3,调用库函数处理无指定形参

    #include <stdio.h> 
    #include <stdarg.h> 
    //这个va_list 是在stdarg.h文件中定义 
    //va_start和va_end函数也是 
    //va_start(va_list ap,last); 
    //type va_arg(va_list,type); 
    //void va_end(va_list ap); 
    
    void test (int a, ...) 
    { 
    
        va_list ap; 
        va_start(ap,a); 
    
        printf("para 1: %d
    ",a); 
        printf("para 2: %s
    ",va_arg(ap,char*)); 
        printf("para 3: %lf
    ",va_arg(ap,double)); 
        printf("para 4: %c
    ",va_arg(ap,int)); 
        printf("para 5: %d
    ",va_arg(ap,int)); 
    
        va_end(ap); 
    } 
    
    int main(void) 
    { 
        test(123,"hello",3.14,'a',567); 
        return 0; 
    }

    结果:

    will@will-laptop:~/ex/11$ ./a.out 
    para 1: 123 
    para 2: hello 
    para 3: 3.140000 
    para 4: a 
    para 5: 567 

    这个宏被展开成一个包含类型为type,值为ap的表达式。参数ap应该首先被宏va_start 或 va_copy初始化,但又必须在被宏va_end调用之前使用。每次调用va_arg都会改变ap值使得后续的参数值能被依次添加。参数type应该是 一个类型名,并且用type*能够得到该类型的指针类型

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/will-boot/p/3355226.html
Copyright © 2011-2022 走看看