我应该如何阅读这些定义?
const char *arguments[]
char *const arguments[]
我看到了使用第一种形式的execl()
代码的示例,但是无法使其在Linux下工作并且不得不使用第二种形式?
答案 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 pointers
至char
的数组。
那就是你不能改变数组的元素,因为它们是恒定的。但是您可以更改数组元素所指向的对象,因为所指向的对象本身并不恒定。
此声明用作参数声明,编译器会对此声明进行隐式调整
char ( * const * arguments )
例如,这两个函数声明声明相同的一个函数
void f( char ( * const ( arguments[] ) ) );
void f( char ( * const * arguments ) );
此声明
const char *arguments[]
声明non-constant pointers
到const char
的未知大小的数组。
也就是说,您可以更改数组的元素,但不能更改数组的元素指向的对象,因为它们指向的对象是恒定的。
此声明可能被重写为
const char ( * ( arguments[] ) )
或者由编译器调整为声明
const char ( ** arguments )
这两个函数声明
void f( const char ( * ( arguments[] ) ) );
void f( const char ( ** arguments ) );
声明相同的一个功能。