2007年4月24日星期二

再说指针和数组

今天在书上看到大致这样的一段代码:
int main(int argc, char *argv[])
{
while (--argc)
printf("%s\n", *++argv);
return 0;
}

于是立刻感觉有地方不妥:++argv.
记得书上是说一个数组名代表的是一个常量指针,但是为何此处可以让一个数组名常量作自增运算呢?

为了证明我的理解的正确性,我还特地写了这么一段代码:
int main(int argc, char *argv[])
{
char *a[2] = {"1", "2"};
printf("%s %s\n", *a, *++a);
return 0;
}
编译:
greenlightzc@greenlightzc-desk:~/Desktop$ gcc -o test test.c
test.c: In function ‘main’:
test.c:6: error: invalid lvalue in increment

和我预期的一样。
但是为什么片段一可以通过编译呢?

原来是形参的问题:数组形参在编译的时候都是转换为指针类型的,也就是说char *argv[]作为形参的时候传进来的是参被转换为char **类型。

还要多亏豹仔和我一起讨论这个看似简单的问题呢: )

没有评论: