2015-12-13 197 views
2

2個月前我開始在大學學習C++,並試圖找出如何將動態二維數組(指向指針的指針)作爲輸入傳遞給函數參數。 我有這樣的動態二維數組:作爲輸入參數的指針(二維數組)的指針

int **p; 
p = new int*[R]; 
for(i=0; i<R; i++) 
    p[i] = new int[C]; 

現在我想這個指針p傳遞給一個函數作爲輸入參數,使用常量。我的意思是我希望函數不能修改矩陣的元素。

我想這樣的:

void func(const int **p) { 
} 

,但我得到這個錯誤:

main.cpp:19:11: error: invalid conversion from 'int**' to 'const int**' [-fpermissive]

main.cpp:9:6: error: initializing argument 1 of 'void func(const int**)' [-fpermissive]

我tryied使用的typedef和它的作品,但它不是恆定的。 如果我做這樣的:

typedef int** abc; 

void func(const abc p); 

main() { 
abc p; 
... 
func(p); 
} 

源編譯,但功能「FUNC」是能夠修改「P矩陣」的值;我希望p是一個輸入參數,它必須是隻讀的!

請問,我該如何傳遞一個指針指向一個標記元素爲只讀的函數?

預先感謝您的幫助和歉意,我的英語不好。

回答

3

const int **p應成爲const int * const *p。從const int **int **的轉換不允許是隱含的,因爲它可能會違反所指向的值的常量。要知道爲什麼,看看C標準(§6.5.16.1)採取了以下代碼片段:

const char **cpp; 
char *p; 
const char c = 'A'; 

cpp = &p;  // constraint violation 
*cpp = &c;  // valid 
*p = 0;   // valid 

如果cpp = &p是一個有效的分配,後續代碼將能夠的c值設置爲0儘管價值是const char

1

試試這個:

typedef const int *cint_ptr_t ; 

void func(const cint_ptr_t *p) { 
} 

請記住,你想成爲常量您的二維數組的元素的指針每行開頭

2
void func(const int * const *p) { 
} 
+0

你能否也請給我一個簡短的解釋呢?非常感謝。 – PeppeDAlterio