0
int main()
{

    int a = 10;

    int *p;   // int *p = a; gives me an error: invalid conversion from int to int *.
              // Tell me why?

    *p = a;   // while this runs

    cout << &a <<"  "<<p;
}

次に &a と p は 2 つの異なる値を与えます。私によると、 a のアドレスとポインター p に格納されている値は同じでなければなりませんか?

4

4 に答える 4

2

int *p = a文字どおりに解釈される は、 に格納されているを取得し、に格納するメモリ アドレスaとして解釈しようとします。計算上は合法ですが、C++ では明示的な型キャストなしではこれを許可しません。通常、これはやりたいことではないからです。p

int *p = aステートメントが異なる理由*p = aは単純です: 最初のステートメント、次の省略形

int *p;
p = a;

はポインタを初期化しているため、RHS のメモリ アドレスが期待されますが、2 番目のステートメントは が指す場所に値を代入しているpため、(この場合) RHS の整数が期待されます。

pを指すように初期化したい場合は、代わりにoraを使用できます。 whereはアドレス演算子です。初期化されていないポインターを逆参照しようとしないでください。基本的に任意の場所でメモリにアクセスすることになり、セグメンテーション違反 (クラッシュの結果) を引き起こしたり、プログラム内の他のデータの上書きを開始したりします (あいまいで再現不可能なバグが発生します)。int * p = &ap = &a&

サンプルコードを実行するpと、 が のアドレスを指すように割り当てられていない&aため、正確に異なる値が得られます。ゼロ以外の値を取得する理由についての簡単な背景: ローカル変数は、関数呼び出しと戻りアドレスに関する情報も格納するstackと呼ばれるメモリの特別な領域から割り当てられます。各プロセスには独自のスタックがあります。ただし、重要なのは、スタックの未使用の領域が実際にはゼロにされたり、使用前にクリーンアップされたりしないことです (デバッグ ビルドを除き、またはpap0xCCCCCCCC0xBAADF00D初期化されていないポインターへ)。コンパイラが自動的にデフォルト値を設定しない場合 (そしてリリース ビルドでは一般に、効率のためにそのような自動初期化は行われません)、表示されているのは、プログラムが設定される前に割り当てられたメモリにたまたまp配置されていたものです。そのスタック フレームをアップします。p

于 2012-08-18T07:35:50.560 に答える
2

int *p = a;構文的に言えば、ポインタではないポインタを初期化します(したがってエラーです)が、がp指すメモリに割り当てます。また、前者は初期化、後者は代入です。a*p=a;ap

あなたの場合、プログラムの正当なメモリを指していないため、未定義の動作*p=aを呼び出すことに注意してください。つまり、にメモリを割り当てていません。pp

于 2012-08-18T07:36:10.213 に答える
1

( ) を指してaいるアドレスにストアします。( )のアドレスを に格納する場合は、次を使用する必要があります。p*pa&ap

p = &a;

を使用int *p = aするとエラーがp発生int*aますint。と考えてくださいint* p = a

于 2012-08-18T07:33:57.603 に答える
0

int *p = a;- これは、変数を宣言し、それに値を代入していることを意味します。変数名はpであり、そのタイプは、int *あなたが割り当てている値ですa(10) に割り当てられpます。int *p = a;と同等です

int *p; 
p = a;

intに値を代入することはできませんint *

*p = a;- これはあなたがそうintではあり*pませんp。だからこれでいい。これを行う前に、他にメモリを割り当てることを忘れないでください。ガベージ値が含まれている可能性があるpため、クラッシュ (未定義の動作) が発生する可能性があります。p

aのアドレスをに割り当てようとしていると思いますp。その場合、以下のようにすることができます。

int a;
int *p = &a;
于 2012-08-18T07:49:44.147 に答える