2011-07-18 415 views
0

我想要一個指向常量的指針,並將它的地址傳遞給一個將增加它的函數。C++指向指針的指針

int f1(const int **ptr) { 
    int n = **ptr; //use pointer 
    (*ptr)++; //increment pointer 
    return n; 
} 

void foo(const int *data) { 
    const int *p = data; 
    const int n = f1(&p); //error: invalid conversion from ‘const int**’ to ‘int**’ 
          //error: initializing argument 1 of ‘int LevelLoader::readWord(byte**)’ 


} 

如何聲明指針?

+0

你爲什麼想改變一個常數?你也可以考慮使用參考 – vickirk

+1

爲什麼當'void'的時候將'f1'的返回值賦給'n'? – rzetterberg

+0

oops。它應該返回n – somewho3

回答

1

此:

const int *data; 

是一個指向恆定整數。這意味着您不允許更改data指向的數據。您可以讀取和複製數據,但你不能做:

(*data) = 5; 

這是非法的在C++中,因爲它被宣佈const int *

如果你把一個const int *的地址,你會得到一個const int **,這是一個指向指針不斷整數。所以你仍然不能改變整數。任何嘗試這樣做都會導致編譯器投訴。

如果您希望能夠更改整數,那麼foof1不應採用const int *值。他們應該採取int *值。


我不想修改常量。我想修改指針(p在foo())

所以,你給了一個指針。並且您想要增加指針。所以只要這樣做:

void foo(const int *data) { 
    const int *p = data; 
    data++; 
} 

您已經增加了指針。這不會影響調用者foo,因爲指針本身是按值複製的。

+0

我想在f1()函數中增加它,所以我需要傳遞指針的地址 – somewho3

+0

呃?他不是試圖修改const int,只是指針。 – richb

+0

我想增加到f1()中的指針,所以我需要通過它的地址 – somewho3

1

再次檢查,此代碼是正確的。它不應該產生你聲稱的錯誤。

編輯:你解決了無效問題,所以回答相應修改。

+0

我想知道爲什麼我的答案是downvoted。代碼是正確的。 – richb

2

嘗試

int f1(const int *& ptr) { 
    int n = *ptr; 
    ++ptr; 
    return n; 
} 

void foo(const int *data) { 
    const int *p = data; 
    const int n = f1(p); 
} 

代替。

錯誤消息指示LevelLoader::readWord不接受const byte**

+0

此代碼完全等同於原始代碼。 – richb

+1

@richb:當我寫它時,'f1'的類型是'void'。校正之後,它與指針變體的指針一樣,它也編譯得很好,但我認爲它有一個指針引用更清晰。 (至少我的)頭腦中很難處理兩個間接指令。所以我認爲我們應該用C++來擺脫它,因爲它是從C繼承的壞習慣。 –