【问题标题】:How would you read these definitions?你会如何阅读这些定义?
【发布时间】:2019-09-27 10:25:07
【问题描述】:

我应该如何阅读这些定义?

  1. const char *arguments[]
  2. char *const arguments[]

我看到execl() 代码使用第一种形式的示例,但无法使其在 Linux 下工作,不得不使用第二种形式?

【问题讨论】:

  • 使用this 找出这些声明的含义。
  • @Blaze:据此,char *const arguments[] 表示Error error
  • the spiral rule也值得一读
  • (1) 给我:将参数声明为指向 const char 的指针数组 (2) 给我:将参数声明为指向 char 的 const 指针数组。
  • “无法在 Linux 下运行”是什么意思?如果您收到错误消息,请在您的问题中显示它并显示产生错误的代码。函数execl() 不接受数组,但函数execv() 接受并且声明为int execv(const char *path, char *const argv[]);,因此您必须使用第二种形式。

标签: c object pointers constants


【解决方案1】:

const char *arguments[]

arguments 是一个未知大小的指针数组,指向const 限定的char

char *const arguments[]

arguments 是一个未知大小的数组,具有const 限定的指向char 的指针。

【讨论】:

    【解决方案2】:

    在 C 中声明符的定义方式如下

    declarator:
        pointeropt direct-declarator
    

    指针定义的地方

    pointer:
        * type-qualifier-listopt
        * type-qualifier-listopt pointer
    

    所以这个声明

    char *const arguments[]
    

    可以像这样重写

    char ( * const ( arguments[] ) )
    

    因此,声明了一个未知大小的数组 constant pointerschar。 也就是说,您可能不会更改数组的元素,因为它们是恒定的。但是你可以改变数组元素所指向的对象,因为指向的对象本身并不是常量。

    用作参数声明,此声明由编译器隐式调整为此声明

    char ( * const * arguments )
    

    例如这两个函数声明声明同一个函数

    void f( char ( * const ( arguments[] ) ) );
    void f( char ( * const * arguments ) );
    

    此声明

    const char *arguments[]
    

    声明一个未知大小的数组non-constant pointersconst char。 也就是说,您可以更改数组的元素,但您不能更改数组元素指向的对象,因为指向的对象它们的sekves 是恒定的。

    这个声明可以重写为

    const char ( * ( arguments[] ) )
    

    或者编译器对声明进行调整

    const char ( **  arguments )
    

    这两个函数声明

    void f( const char ( * ( arguments[] ) ) );
    void f( const char ( ** arguments ) );
    

    声明同一个函数。

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2018-01-27
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2010-09-10
      • 2017-09-12
      相关资源
      最近更新 更多