指向常量数组的指针的正确定义是什么

What is the correct definition of pointer to a constant array?

本文关键字:定义 是什么 指针 常量 数组      更新时间:2023-10-16

我想实现一个函数,该函数必须在C++中返回指向数组的指针,如下所示:

typedef double* ptr;
ptr func(size_t m) {
  return A[m];
}

其中A是全局定义的二维数组(或作为实现类的成员(。

现在,我想确保调用方无法修改返回的数组。我想知道如何声明函数的返回类型以保证这一点。

我试图将其定义为:

const ptr func(size_t m) {
  return A[m];
}

但我可以写:

ptr x = func(5); 
x[10] = 20.4;

上面的编译没有任何问题。

给定以下代码:

#include <stdlib.h>
static double A[100][100];
const double* func(size_t m) {
      return A[m];
}
int main() {
    double * x = func(5);
    x[10] = 20.4;
}

GCC 4.8.1 报告:

foo.cc:10:21: error: invalid conversion from ‘const double*’ to ‘double*’ [-fpermissive]
  double * x = func(5);
                     ^

和 Clang 3.3 报告:

foo.cc:10:11: error: cannot initialize a variable of type 'double *' with an rvalue of type 'const double *'
        double * x = func(5);
                 ^   ~~~~~~~

为了充实ComicSansMS的评论,因为他正在回复的评论被删除了:

typedef double* ptr;
const ptr func(size_t m) {
    return A[m];
}

此代码与上面发布的代码不同。 const ptr 是指向双精度的常量指针。原始代码引用指向常量双精度的指针。


你可以通过做一些事情

来做一些事情:

typedef double* ptr;
typedef const double* cptr;
cptr func(size_t m) {
    return A[m];
}
int main() {
    ptr x = func(5);
    x[10] = 20.4;
}

这将报告错误:

so.cc:27:6: error: cannot initialize a variable of type 'ptr' (aka 'double *') with an rvalue of type 'cptr' (aka 'const double *')
        ptr x = func(5);
            ^   ~~~~~~~

const double*double const*都表示指向常量双精度的指针。用户可以修改指针引用的位置,但不能修改指向的值。

double * const 表示指向双精度的常量指针。用户可以将指向的值修改为双精度,但不能修改指针引用的位置。

double const * const 指示指向常量双精度的常量指针。用户不能修改双精度值或指针引用的位置。