argv 指向指针数组的指针

2024-02-01

我对以下段落与后面的代码如何匹配感到困惑:

由于 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 数组的指针ints 并且它实际上被初始化为指向这样一个数组。

然而,该术语也经常使用其不太正式的含义。在这个例子中

int a[10];
int *p = &a;

p被声明为一个简单的指针int。它被初始化为指向数组的第一个元素a。你经常可以听到和看到人们这样说p在这种情况下也“指向一个数组”ints,尽管这种情况在语义上与之前的情况不同。在这种情况下,“指向数组”意味着“通过指针算术提供对数组元素的访问”,如p[5] or *(p + 3).

这正是“...”这句话的意思。argv是一个指向指针数组的指针......”你引用了。argv的参数列表中的声明main相当于char **argv, 意思是argv实际上是一个指向char *指针。但由于它物理上指向某个数组的第一个元素char *指针(由调用代码维护),半非正式地说是正确的argv指向一个指针数组。

这正是您引用的文字的含义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

argv 指向指针数组的指针 的相关文章