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

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

即:如果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及更高版本的标准是相关的)

首先我要说:

 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); 

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

T * const arr表示arr不应该改变。
const T * arr表示*arr不应更改。
const T * const arr意味着不应该更改arr*arr

所以这就像在void f(const T arr[]);
它就像上面的一个3.在鼠标hover在下面之前做出选择。

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等。

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

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