【问题标题】:why can argv use increment operator为什么 argv 可以使用自增运算符
【发布时间】:2015-11-09 02:54:51
【问题描述】:

在 K&R 的书中

#include <stdio.h>

main(int argc, char *argv[])
{
    while (--argc > 0)
        printf("%s%s", *++argv, (argc > 1) > " " : "");
    printf("\n");
    return 0;
}

这本书里说数组不能使用自增或自减操作符,在这个程序中“argv”应该是数组的名字,为什么可以使用自增操作符?

【问题讨论】:

  • argv 不是一个数组,它是一个指针,因为在函数参数中,数组类型被调整为指针类型。
  • 因为数组类型被调整了......所以它是一个数组
  • @Michi 不,这不是数组,请阅读我的评论。

标签: c arrays pointers increment argv


【解决方案1】:

main的第二个参数

char *argv[]

被调整为指向数组第一个元素的指针。那就是它有类型

char **argv;

你可以增加指针。

因此,最初argv(调整为指针)指向指向字符串的指针数组的第一个元素,然后++argv 指向数组的第二个元素,依此类推。

根据 C 标准 (6.7.6.3 Function declarators (including prototypes))

  1. 应调整将参数声明为“类型数组” to ‘‘qualified pointer to type’’,类型限定符(如果有的话) 是在数组类型的[] 中指定的那些 推导。

【讨论】:

  • 此引用不完整,您应该澄清它仅适用于函数声明符。
【解决方案2】:

你错了。 argv 不是数组。它是一个指向char 的指针。指针可以递增/递减。和

main(int argc, char *argv[])

相同
main(int argc, char **argv)

【讨论】:

  • 我明白了,但是,char *[] 和 char ** 有什么区别吗?
  • 因为数组衰减为指针 - char *[]char** 本质上是相同的(指向 char 指针的指针)。
  • @Micheal 在这种情况下,不,没有区别。正如@Vlad 在his answer中指出的那样,char*[] 被调整为char**
  • @Michi 这取决于声明对象的位置。 [] 在所有情况下都表示“数组”除了函数参数,它表示“指针”。
  • @artm 不,你错了,不是关于数组到指针的衰减。那是关于数组类型的表达式。此规则是声明的数组到指针调整,并且仅对函数参数有效,因此在更多场景中执行数组到指针衰减。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 2020-12-07
  • 1970-01-01
  • 2011-10-29
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多