指向常量数组的指针的正确定义是什么
What is the correct definition of pointer to a constant array?
我想实现一个函数,该函数必须在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
指示指向常量双精度的常量指针。用户不能修改双精度值或指针引用的位置。
相关文章:
- C++中"dependent name"的定义是什么?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- Eclipse CDT 不了解方法定义是什么
- 与 I/O 完成端口的"NumberOfConcurrentThreads"相关的"runnable thread"的定义是什么?
- 这个 typedef 定义是什么意思
- 这两段代码的函数定义是什么
- 指向常量数组的指针的正确定义是什么
- 移动平台的预处理器定义是什么?
- xorshift128+算法的真正定义是什么
- typedef Vec<int, 2> Vec2i; 这个定义是什么意思?
- 常量正确性的定义是什么?
- "variable"的定义是什么?
- 声明性区域的实际定义是什么?
- 有效和无效的PP代币的定义是什么?
- 未声明标识符和标识符未定义是什么意思?如何修复错误
- boost::asio::io_service就绪处理程序的定义是什么?
- c++中位操作符的定义是什么?
- c++中与#define KB_UP 72相关的其他定义是什么?它们都是什么?
- 以下结构定义是什么意思