【问题标题】:What is const when you declare a "pointer type" formal (function) parameter "like an const array"?当您声明“指针类型”形式(函数)参数“像 const 数组”时,什么是 const?
【发布时间】:2016-06-13 16:24:07
【问题描述】:

当你声明一个“指针类型”形式(函数)参数“像一个 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 及更高版本的标准是相关的)

【问题讨论】:

  • C11 标准草案 n1570:6.7.6.3 函数声明符(包括原型) 7 将参数声明为“类型数组”应调整为“限定类型指针” ',其中类型限定符(如果有)是在数组类型派生的 [ 和 ] 中指定的那些。
  • 我不明白这个问题。你是在问,“什么是 const?” const 和这个有什么关系?
  • @ChristopherSchneider 好吧 - const 声明通常提供对变量或形式参数的写访问限制。如果变量/形式是指针,您可以保护指针的值或指向的对象的值,或两者兼而有之。 “看起来像”数组的形式参数实际上是指针。我问const 声明是否适用于指针的值,或指向的对象的值,或两者兼而有之。
  • @EOF 是否意味着:const T * const arr 等价于const T arr[const]T * const arr 等价于T arr[const]?如果是这样,这是否也适用于旧的 ANSI C?这是常用的/意识形态吗?还是我误会了?
  • @MarkA.:在 C99 草案标准 n1256,6.7.5.3 Function declarators (including prototypes) 中可以找到相同的规定。我没有可用的旧标准,但由于 POSIX 需要 C99 编译器,任何健全的环境都应该提供一个。

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


【解决方案1】:

首先我要说的是:

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

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

【讨论】:

    【解决方案2】:

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

    那么void f(const T arr[]); 中的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 等。

    【讨论】:

    • 我的意思是如果这两种语言在这一点上有所不同。关于早期的 C 我会补充一点,我只想知道 C89 及更高版本。
    • @Mark A. 建议在您的帖子中添加这些说明。
    【解决方案3】:

    对于 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 被丢弃。 IE。以这种方式不同的两个函数声明表示同一个函数。

    【讨论】:

    • 我不确定您和@Stivius 为何强调案例 [2] - 因为我认为我并没有模棱两可。 [3] 我不太明白。但我的主要问题是用 [1] 回答的。 :-) 你知道这种行为的标准是否不同吗?
    • Re [3],在 C++ 中一直如此。抱歉,我没有注意到您还标记了您的问题 C。它们是两种不同的语言没有像“C/C++”这样的语言。请去掉 C 标签。
    • 我想保留 C 和 C++,因为我必须处理这两种语言的接口。我希望关于这个主题的答案是:“C 和 C++ 在这里没有区别”:-)
    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-01-03
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多