2013-10-09 97 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的值或指針引用的位置。

相關問題