我想实现一个必须在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;
以上编译没有任何问题。
答案 0 :(得分:3)
给出以下代码:
#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
是指向double的常量指针。原始代码引用指向常量double的指针。
你可以通过以下方式做一些事情:
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);
^ ~~~~~~~
答案 1 :(得分:2)
const double*
和double const*
都表示指向常量double的指针。用户可以修改指针引用的位置,但不能修改指向的值。
double * const
表示指向double的常量指针。用户可以修改指向double的值,但不能修改指针引用的位置。
double const * const
表示指向常量double的常量指针。用户不能修改double的值或指针引用的位置。