Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指向常量数组的指针的正确定义是什么? 我想实现一个函数,它必须返回C++中数组的指针,比如: typedef double* ptr; ptr func(size_t m) { return A[m]; }_C++_Arrays_Function_Pointers - Fatal编程技术网

指向常量数组的指针的正确定义是什么? 我想实现一个函数,它必须返回C++中数组的指针,比如: typedef double* ptr; ptr func(size_t m) { return A[m]; }

指向常量数组的指针的正确定义是什么? 我想实现一个函数,它必须返回C++中数组的指针,比如: typedef double* ptr; ptr func(size_t m) { return A[m]; },c++,arrays,function,pointers,C++,Arrays,Function,Pointers,其中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

其中
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;
}
和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);
                 ^   ~~~~~~~

为了充实漫画的评论,因为他回应的评论被删除了:

typedef double* ptr;

const ptr func(size_t m) {
    return A[m];
}
此代码与上面发布的代码不同
const ptr
是指向双精度计数器的常量指针。原始代码引用指向常量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);
            ^   ~~~~~~~

给定以下代码:

#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;
}
和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);
                 ^   ~~~~~~~

为了充实漫画的评论,因为他回应的评论被删除了:

typedef double* ptr;

const ptr func(size_t m) {
    return A[m];
}
此代码与上面发布的代码不同
const ptr
是指向双精度计数器的常量指针。原始代码引用指向常量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);
            ^   ~~~~~~~

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

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


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

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

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


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

如果需要指向数组的指针,应该返回
&A[m]
。@chris
A
已经是一个二维数组,即类似于
double**A
的东西,函数返回指向其第m行的指针。这不是二维数组,而是指向double的指针。返回
A[m]
返回指向双精度的指针。无法从
double**
@EricPostpischil done获取指向数组的指针!如果需要指向数组的指针,应该返回
&A[m]
。@chris
A
已经是一个二维数组,即类似于
double**A
的东西,函数返回指向其第m行的指针。这不是二维数组,而是指向double的指针。返回
A[m]
返回指向双精度的指针。无法从
double**
@EricPostpischil done获取指向数组的指针!VC++2008出现错误:
'initialization':无法从'const double*'转换为'double*'
VC++2012:错误C2440:'initialization':无法从'const double*'转换为'double*'qualifiers@ManiBastaniParizi这是因为代码中的
const ptr
double*const
,不是一个
double const*
@manibustaniparizi您需要第二个
typedef double const*const\u ptr
,然后返回一个
const\u ptr
而不是
const ptr
(我知道,这很混乱)这就是为什么
const
应该总是写在右边的原因。VC++2008给出了一个错误:
初始化:无法从“const double*”转换为“double*”
VC++2012:错误C2440:“初始化”:无法从“const double*”转换为“double*”qualifiers@ManiBastaniParizi这是因为a
constptr
在你的代码中是一个
double*const
,而不是
double-const*
@manibustaniparizi你需要第二个
typedef double-const*const*ptr
然后返回一个
const\ptr
而不是
const-ptr
(我知道,这很混乱)这就是为什么
const
应该总是写在右边。