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

2017-07-21 16:02:50 +08:00
 gps32251070
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]);
}
2351 次点击
所在节点    C
11 条回复
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
2017-07-21 16:13:32 +08:00
仔细看看编译器警告就懂了:

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

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

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

多做几个题就懂了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/377007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX