1

ポインタ値への整数値の加算を理解するために、次のプログラムを作成しました。私の場合、ポインタは整数を指しています。pが整数へのポインタである場合、p + 2は「2つの整数先」(または2 *4バイト=8バイト)に格納されている整数のアドレスであることを理解しています。以下のプログラムは、整数配列では期待どおりに機能しますが、char配列では、空の行を出力するだけです。誰かが私に理由を説明してもらえますか?

#include <iostream>

int main() {

    int* v = new int[10];

    std::cout << "addresses of ints:" << std::endl;

    // works as expected
    for (size_t i = 0; i < 10; i++) {
        std::cout << v+i << std::endl;
    }

    char* u = new char[10];

    std::cout << "addresses of chars:" << std::endl;

    // prints a bunch of empty lines
    for (size_t i = 0; i < 10; i++) {
        std::cout << u+i << std::endl;
    }

    return 0;
}
4

3 に答える 3

6

特別な意味 (C 文字列) があるためchar *、文字列として出力しようとします。ポインターをキャストして、cout必要なものを知らせます。

std::cout << (void *)(u+i) << std::endl;
于 2012-08-23T21:10:01.530 に答える
1

a を印刷すると、char*文字列が印刷されます。したがって、ジャンク値を取得しています。int にキャストして印刷できます。

std::cout << (int)(u+i) << std::endl;

コメントから編集:

指摘されているように、void*キャストの方が優れています。私の知る限り、印刷intは問題ありvoid*ませんが、正しい方法です

于 2012-08-23T21:11:42.130 に答える
1

ポインター値を long long に変換するとうまくいきました。

    std::cout << (long long)(u+i) << std::endl;

大容量メモリ (> 2 GB) がある場合は、int の代わりに long long を使用する必要があります。

于 2012-08-23T21:14:23.577 に答える