1

C++ でのポインター演算の動作に混乱しています。配列があり、現在の要素から N 要素を進めたいと考えています。C++ ではポインタは BYTES のメモリ アドレスであるため、コードがnewaddr = curaddr + N * sizeof(mytype). ただし、エラーが発生しました。newaddr = curaddr + N後で、すべてが正しく機能することがわかりました。なんでそうなの?address + N * sizeof ではなく、本当に address + N であるべきですか?

私が気づいたコードの一部 (すべてのメモリが 1 つのチャンクとして割り当てられた 2D 配列):

// creating pointers to the beginning of each line
if((Content = (int **)malloc(_Height * sizeof(int *))) != NULL)
{
    // allocating a single memory chunk for the whole array
    if((Content[0] = (int *)malloc(_Width * _Height * sizeof(int))) != NULL)
    {
        // setting up line pointers' values
        int * LineAddress = Content[0];
        int Step = _Width * sizeof(int); // <-- this gives errors, just "_Width" is ok
        for(int i=0; i<_Height; ++i)
        {
            Content[i] = LineAddress; // faster than
            LineAddress += Step;      // Content[i] = Content[0] + i * Step;
        }
        // everything went ok, setting Width and Height values now
        Width = _Width;
        Height = _Height;
        // success
        return 1;
    }
    else
    {
        // insufficient memory available
        // need to delete line pointers
        free(Content);
        return 0;
    }
}
else
{
    // insufficient memory available
    return 0;
}
4

3 に答える 3

3

推論のエラーはここにあります:「C++ ポインターは BYTES のメモリアドレスであるため、[...]」。

AC/C++ ポインタはバイト単位のメモリ アドレスではありません。確かに、メモリ アドレスで表されますが、ポインター型とその表現を区別する必要があります。操作「+」は、その表現ではなく、型に対して定義されます。したがって、それが 1 つのタイプと呼ばれる場合int *、このタイプのセマンティクスが尊重されます。したがって、+ 1型は、基になる型表現が使用するint *バイト数だけポインターを進めます。int

もちろん、次のようにポインターをキャストできます(int)myPointer。これで、(ポインター型ではなく)+ 1数値型が作成されました。これは、数値型から期待されるとおりに機能します。このキャストの後、表現は同じままですが、型が変わることに注意してください。

于 2012-06-14T16:49:12.667 に答える
2

「ポインター」は場所を指します。

「インクリメント」すると、の隣接する場所に移動します。

Q: 「次」と「隣接」は、指しているオブジェクトのサイズによって異なりますね。

Q: "sizeof()" を使用しない場合、すべてが機能しますよね? なんで?コンパイラは「あなたの背後で」あなたのために何をしていると思いますか?

Q: 独自の「sizeof()」を追加するとどうなると思いますか?

「すべてが機能する」シナリオの上に

于 2012-06-14T16:38:00.703 に答える
2

ポインタはアドレスを指すため、ポインタ p を N ずつインクリメントすると、p から N 番目のメモリ ブロックがポイントされます。

ここで、アドレスへのポインターの代わりにアドレスを使用している場合は、N*sizeof(type) を追加するのが適切です。

于 2012-06-14T16:50:02.120 に答える