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]);
}
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. |
2
kokutou 2017-07-21 16:13:32 +08:00
仔细看看编译器警告就懂了:
|
3
kokutou 2017-07-21 16:16:01 +08:00
说白了就是 printf 里,
%d 要的是 int %s 要的是 char * |
4
gps32251070 OP @kokutou 也就是 s%需要的是字符串数组首位字符的地址?
|
5
besto 2017-07-21 16:38:03 +08:00
1. a[1] == *(a+1) == *(1+a) == 1[a] 学过汇编的都懂。
2. 你的理解没问题,但无论用指针方式取值还是用数组下标取值*argv 和 argv[0]取出来的都是 char *. |
6
gps32251070 OP @besto 看来是我对%s 的理解不到位
|
8
crazyjin 2017-07-21 16:46:06 +08:00
@andrewhxism 正解
|
9
Kilerd 2017-07-21 16:49:11 +08:00 via iPhone
我感觉你的指针没学好
|
10
gps32251070 OP @andrewhxism 谢谢
|
11
kokutou 2017-07-21 17:13:26 +08:00
|