2013-10-09 61 views
0

我想要实现谁拥有的指针返回到C中的阵列++函数,是这样的:指向常量数组的指针的正确定义是什么?

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

其中A是全局定义的2-d阵列(或作为执行类的一个成员) 。我想确保返回的数组不能被调用者修改。我想知道如何声明函数的返回类型来保证这一点。

我曾试图把它定义为:

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

,但我可以这样写:

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

,并没有任何问题,上述编译。

+0

如果你想要一个指向数组的指针,你应该返回'&A [m]'。 – chris

+0

@chris'A'已经是一个二维数组,即类似'double ** A',函数返回指向其第m行的指针。 – PBM

+0

这不是一个二维数组,而是一个指向double的指针。返回'A [m]'返回一个指向double的指针。没有办法从'double **'获得指向数组的指针。 – chris

回答

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

而且锵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); 
      ^ ~~~~~~~ 
+0

VC++ 2008提供了一个错误[C2440](http://msdn.microsoft.com/en-us/library/sy5tsf8z%28v=vs.90%29.aspx):''initializing':can not convert from'const double *'to'double *'' – ComicSansMS

+0

VC++ 2012:错误C2440:'初始化':无法从'const double *'转换为'double *'转换失去限定符 – 2013-10-09 14:45:07

+0

感谢您的回答。是的,我尝试了完全相同的代码,并且出现错误。但是,如果我添加一行'typedef double * ptr',然后用'ptr'替换代码中的所有'double *',代码将无错地编译。 'typedef'会发生什么? – PBM

2

const double*double const*都表明一个指向一个恒定的两倍。用户可以修改指针引用的位置,但不能修改指向的值。

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

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

相关问题