您将如何阅读这些定义?

时间:2019-09-27 10:25:07

标签: c object pointers const constants

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

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

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

2 个答案:

答案 0 :(得分:2)

  

const char * arguments []

arguments是指向const合格char的指针大小未知的数组。

  

char * const参数[]

arguments是一个未知大小的数组,其中包含const个指向char的合格指针。

答案 1 :(得分:1)

在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的未知大小的数组。 也就是说,您可以更改数组的元素,但不能更改数组的元素指向的对象,因为它们指向的对象是恒定的。

此声明可能被重写为

const char ( * ( arguments[] ) )

或者由编译器调整为声明

const char ( **  arguments )

这两个函数声明

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

声明相同的一个功能。