当你声明一个“指针类型”形式(函数)参数“像一个const数组”时,const是什么?

时间:2016-06-13 16:24:07

标签: c++ c arrays const function-prototypes

当你声明一个“指针类型”形式(函数)参数“就像一个const数组”时,const是什么?

I.e。:如果T是类型标识符,则为:

void f(const T arr[]);

相当于:

void f(const T * const arr);

void f(const T * arr);

void f(T * const arr);

如何解密C / C ++标准以找到这些等价物呢? : - )

C和C ++之间以及有关上述声明含义的标准的不同版本之间是否存在差异? (对于C - ANSI C89及更高版本的标准是相关的)

3 个答案:

答案 0 :(得分:0)

首先我要说:

void f(int const* p);

void f(const int* p);

具有相同的含义,这意味着它是指向您无法更改的值的指针。

有另一种声明指针的方法:

void f(int* const p);

这意味着常量指针,您无法将其指定给另一个地址。

至于你的问题,下面的代码

void f(const T arr[]);

将转换为

void f(const T* arr);

它将指向数组的第一个元素

答案 1 :(得分:0)

对于C ++(目前问题也标记为C):

这里涉及三种不同的等价。 [1] const T arr[]形式参数类型衰减为T const* arr,因此在形式参数类型的上下文中是等价的。 [2] T const* arr相当于const T* arr,这是另一种表达相同的语法。 [3]在函数类型的上下文中,T const* arr中的形式参数类型等同于T const* const arr,因为顶级const被丢弃以便确定功能类型。即以这种方式不同的两个函数声明表示相同的函数。

答案 2 :(得分:0)

T * const arr表示arr不应更改 const T * arr表示不应更改*arr const T * const arr表示不应更改arr*arr

那么arr中的void f(const T arr[]);是什么? 它就像上面的其中之一3.在鼠标悬停在下面之前做出选择。

  

void f(const T *arr);

  

如何解密C / C ++标准以找到这些等价物?

多次阅读标准会有所帮助。给定实例的有用网站是C gibberish ↔ English

// declare f as function (pointer to const int) returning void
void f(const int *);
  

C和C ++之间以及标准的不同版本之间是否存在差异?

是的,当然,因为C / C ++是不同的语言。 C ++有引用变量。早期的C没有const等等。