V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gps32251070
V2EX  ›  C

请教关于 C 语言中 main 函数的参数 argv

  •  
  •   gps32251070 · 2017-07-21 16:02:50 +08:00 · 2366 次点击
    这是一个创建于 2715 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int main(int argc, char *argv[])
    {
        ...
    }
    
    

    上面的 argv 说是指针数组,然后按指针的取值方式

    *argv
    *++argv
    

    这样取值可以理解。 但是为什么也可以直接用数组下标获取?

    argv[0]
    argv[1]
    

    这个返回的不应该是一个内存地址? 我自己试着这样获取是有错误的

    int main(int argc, char *argv[])
    {
        int a = 1, b = 2;
        int * arr[] = {&a, &b};
        printf("%d\n", arr[0]);
    }
    

    这样才行

    int main(int argc, char *argv[])
    {
        int a = 1, b = 2;
        int * arr[] = {&a, &b};
        printf("%d\n", *arr[0]);
    }
    
    11 条回复    2017-07-21 17:13:26 +08:00
    andrewhxism
        1
    andrewhxism  
       2017-07-21 16:08:29 +08:00
    第一个问题,在传入参数为一维数组名时,数组名退化为指针,所以*argv,*++argv 和 argv[0],argv[1]是等价的。
    第二个问题,arr[0]里面存的是 a 的地址,%d 打印出来是将地址强转为数字后的结果,你可以打印%p 试一下。加了引用后*arr[0]打印的就是 a 的值 1.
    kokutou
        2
    kokutou  
       2017-07-21 16:13:32 +08:00
    仔细看看编译器警告就懂了:

    kokutou
        3
    kokutou  
       2017-07-21 16:16:01 +08:00
    说白了就是 printf 里,

    %d 要的是 int
    %s 要的是 char *
    gps32251070
        4
    gps32251070  
    OP
       2017-07-21 16:35:46 +08:00
    @kokutou 也就是 s%需要的是字符串数组首位字符的地址?
    besto
        5
    besto  
       2017-07-21 16:38:03 +08:00
    1. a[1] == *(a+1) == *(1+a) == 1[a] 学过汇编的都懂。
    2. 你的理解没问题,但无论用指针方式取值还是用数组下标取值*argv 和 argv[0]取出来的都是 char *.
    gps32251070
        6
    gps32251070  
    OP
       2017-07-21 16:43:00 +08:00
    @besto 看来是我对%s 的理解不到位
    boboliu
        7
    boboliu  
       2017-07-21 16:43:19 +08:00
    @besto 跟汇编没啥关系吧
    crazyjin
        8
    crazyjin  
       2017-07-21 16:46:06 +08:00
    @andrewhxism 正解
    Kilerd
        9
    Kilerd  
       2017-07-21 16:49:11 +08:00 via iPhone
    我感觉你的指针没学好
    gps32251070
        10
    gps32251070  
    OP
       2017-07-21 16:53:05 +08:00
    @andrewhxism 谢谢
    kokutou
        11
    kokutou  
       2017-07-21 17:13:26 +08:00
    @gps32251070

    因为 c 里面没有字符串这个概念。只有字符数组。
    printf %s 打印字符,就是顺着往后面打印每个字符,遇到'\0'停止。

    多做几个题就懂了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:01 · PVG 05:01 · LAX 13:01 · JFK 16:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.