2011-07-18 19 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が指すデータを変更することはできません。あなたは、読み、データをコピーしますが、できること、できないこと:

Cで違法だ++、それは const int *を宣言したため
(*data) = 5; 

あなたがconst int *のアドレスを取る場合は、あなたが定数整数へのポインタへのポインタであるconst int **を取得。だからあなたはまだ整数を変更することはできません。そうしようとすると、コンパイラは不平を言うでしょう。

整数を変更したい場合は、foof1は、const int *の値をとるべきではありません。彼らはint *の値を取る必要があります。


私は定数を変更する必要はありません。私はそれへのポインタを変更したい(foo()のp)

したがって、ポインタが与えられています。そしてポインタをインクリメントしたいとします。だからそうしてください:

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

あなたはポインタを増分しています。ポインタ自体が値によってコピーされるので、これは呼び出し側にfooへの影響を与えません。

+0

f1()関数でインクリメントしたいので、ポインタのアドレスを – somewho3

+0

に渡す必要がありますか?彼は定数int、ポインタだけを変更しようとしていません。 – richb

+0

私はf1()のポインタにインクリメントしたいので、そのアドレスを渡す必要があります – somewho3

1

もう一度確認してください。このコードは正しいです。あなたが主張しているエラーを生成すべきではありません。

編集:ボイドの問題を修正し、それに応じて回答を修正しました。

+0

私の答えはなぜ落ちたのでしょうか?コードは正しいです。 – 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::readWordconst byte**を受け取らないことを示します。

+0

このコードはオリジナルとまったく同じです。 – richb

+1

@richb:私がそれを書いたとき、 'f1'の型は' void'でした。その訂正の後、ポインタバリアントへのポインタと同じことを行いますが、それはコンパイルもうまくいきますが、ポインタ参照を持つ方がきれいだと思います。 2つの迂回は(少なくとも私の)心では扱いにくいです。だから私はCから継承する悪い習慣であるので、C++でそれを取り除くべきだと思います。 –

関連する問題