0

cplusplus.comのチュートリアルの「void ポインター」の例で、次のように比較してみます。なぜまだ*括弧が必要なのですか?いいえの場合はどうなり*ますか?

void increase(void* data, int psize) {
    if (psize == sizeof(char)) {
        char* pchar;
        pchar = (char*) data;
        cout << "pchar=" << pchar << endl;
        cout << "*pchar=" << *pchar << endl;
        //++(*pchar);   // increases the value pointed to, as expected
        ++(pchar);      // the value pointed to doesn't change 
    } else if (psize == sizeof(int)) {
        int* pint;
        pint = (int*) data;
        //++(*pint);   // increases the value pointed to, as expected
        ++(pint);      // the value pointed to doesn't change 
    }
}

int main() {
    char a = 'x';
    int b = 1602;
    increase(&a, sizeof(a));
    increase(&b, sizeof(b));
    cout << a << ", " << b << endl;
    return 0;
}

解決策を受け入れた後に更新します)@Cody Grayの回答に基づいて、得られなかったものを明確にしようとします。のアドレスはpchar、意味のない場所を指すようにインクリメントされます。しかし、変数ainmaincoutではなく ted であるためpchar、これcoutでも意味のある値が出力されます (この例では 'x' になります)。

4

2 に答える 2

4

*演算子はポインターを逆参照します。

したがって、このコード:

++(*pint)

が指す 値をインクリメントしますpint

対照的に、このコード:

++(pint)

ポインタ自体をインクリメントします, pint. これが、ポインターが指す値が変わらない理由です。ポインターが指す値を変更するのではなく、ポインター自体の値を変更します。

ポインタをインクリメントすると、メモリ内のまったく異なる値を指すようになります。この場合、単一の整数にスペースを割り当てただけなので、意味のない値を指します。

于 2012-05-14T23:31:01.963 に答える
1

ポインタから別のポインタへのキャストを行う場合

char* pchar;
pchar = (char*) data;

このメモリを char ポインターとして処理するようにコンパイラーに指示すると、この変数へのポインター演算を実行できます。したがって、ポインタだけでポインタの値を操作しているのではありません。これは、算術演算を行っているメモリアドレスです。

値を操作するには、「*」を使用するか、文字によるメモリ ポインタへのアクセスが必要です。

于 2012-05-14T23:35:05.573 に答える