我对以下段落与后面的代码如何匹配感到困惑:
由于 argv 是指向指针数组的指针,我们可以操纵
指针而不是索引数组。下一个变体基于
递增 argv,这是一个指向 char 的指针,而 argc
正在倒数:
#include <stdio.h>
/* echo command-line arguments; 2nd version */
main(int argc, char *argv[])
{
while (--argc > 0)
printf("%s%s", *++argv, (argc > 1) ? " " : "");
printf("\n");
return 0;
}
Isn't char *argv[]
只是一个指针数组?指向指针数组的指针不会写成char *(*argv[])
或者类似的东西?
附带说明一下,一般来说,我发现混合数组和指针的声明相当令人困惑,这是否正常?
在 C 术语中,诸如“指向数组的指针”或“指向数组”之类的术语通常被相当宽松地对待。它们至少可以意味着两种不同的事物。
从该术语最严格和迂腐的意义上来说,“指向数组的指针”必须用“指向数组的指针”类型声明,如下所示
int a[10];
int (*p)[10] = &a;
在上面的例子中p
被声明为指向 10 数组的指针int
s 并且它实际上被初始化为指向这样一个数组。
然而,该术语也经常使用其不太正式的含义。在这个例子中
int a[10];
int *p = &a;
p
被声明为一个简单的指针int
。它被初始化为指向数组的第一个元素a
。你经常可以听到和看到人们这样说p
在这种情况下也“指向一个数组”int
s,尽管这种情况在语义上与之前的情况不同。在这种情况下,“指向数组”意味着“通过指针算术提供对数组元素的访问”,如p[5]
or *(p + 3)
.
这正是“...”这句话的意思。argv
是一个指向指针数组的指针......”你引用了。argv
的参数列表中的声明main
相当于char **argv
, 意思是argv
实际上是一个指向char *
指针。但由于它物理上指向某个数组的第一个元素char *
指针(由调用代码维护),半非正式地说是正确的argv
指向一个指针数组。
这正是您引用的文字的含义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)