0

値 ( など) を使用してポインターを宣言して初期化したいのですが、10002 番目の変数を使用したくありません。下記を参照してください :

int *p = &1000;
Output: error : & on Constant

int *p = (int *)1000;
Output: 0000003E8

int *p = new int(1000);
Output: 1000

最初の 2 つの方法では期待どおりの出力が得られないためです。だから、私は知りたいのですが、どちらが正しい方法で、その理由は何ですか?

参照

4

7 に答える 7

2

ポインタの全体的なポイント(しゃれは意図されていません)は、別の変数(または少なくとも一部のメモリ)を指すことです。3番目の例のように、実際の変数ではなく、動的に割り当てられたメモリのチャンクにすることができます。

整数リテラルで初期化しようとしても、あまり意味がありません。ポインタ型にキャストされた整数リテラルで初期化することは、非常に限られた状況でのみ意味があります。これにより、その絶対メモリアドレスを直接読み取り/書き込みすることができます。これは、そのアドレスでアクセスできるメモリマップドデバイスのようなものを備えている可能性のある小さな組み込みシステムのようなもので意味があります。そうでなければ、それはほとんど無意味で役に立たないです。

用語はさておき、ポインタを宣言するだけでなく、実際にポインタを定義していることになります。宣言は次のようになります。

extern int *p;

これは、他の場所(つまり、他の翻訳単位)で定義されたポインターの存在についてコンパイラーに通知します。ほとんどの場合、ヘッダーに表示されます。コンパイラーにポインターについて通知するだけなので、宣言を含めることはできません。

于 2012-11-30T04:41:18.903 に答える
1

あなたのコメントによると、

*p を実行しようとすると、1000 と表示されます。

整数を格納する場所を指すようにポインターを初期化します1000。絶対アドレスを指すようにポインターを初期化する必要はありませ1000

あなたが提供した3行のコードのうち、最後の行だけがあなたが望むことをします:

int *p = new int(1000);

intこれにより、ヒープ上の にスペースが割り当てられ、そのスペースが で値初期化されます1000

ノート:

  • ヒープ上の単一の領域の割り当てintが必要になる場合もありますが、ほとんどの場合、それは役に立ちません。なぜなら、intは非常に小さなオブジェクトだからです。ポインターは、同じかそれ以上の大きさである可能性が非常に高いため、ポインター自体intを渡すのではなく、へのポインターを渡すintことは、用途が限られています。

  • これが本当に必要だと思う場合は、後でそのスペースの割り当てを解除する必要があることに注意してください。

    delete p;
    
  • 一般的な注意として、ほとんどの場合、ヒープにスペースを割り当て、それへのポインターを維持する必要があります。スマート ポインター ( C++11 ではstd::unique_ptr<int>またはなど) を使用して、割り当て解除を考える必要がないようにする方がはるかに優れています。std::shared_ptr<int>

于 2012-11-30T05:08:57.843 に答える
0
#include<stdio.h>

int main()
{
    int *ptr = (int *)1000;

    printf("%d\n", ptr);
    return 0;
}

しかし、これはポインターに値を代入する正しい方法ではありません。

于 2012-11-30T05:10:17.177 に答える
0

参照ページ自体に記載されているように、演算子のアドレスを定数に適用することはできません。

この方法でポインタを初期化する理由は不明です。定数を別の変数に割り当て、演算子のアドレスを使用することをお勧めします。

ポインター値がコードのどこかで変更される場合は、ポインターを NULL で初期化することをお勧めします。

于 2012-11-30T04:38:43.187 に答える
0

最初のものは間違っています(受け入れられた回答とコンパイラによって指摘されているように)
2番目のものは正しいようですが、何を表示しているのかわかりません。値の代わりに p で表されるアドレスを表示している可能性があります。 p の代わりに *p を表示してみ

ください

int a = 1000;
int *p;
p=&a;
于 2012-11-30T04:39:06.793 に答える
0

int * p = 新しい int; *p = 1000;

それがあなたが望むものです。最初の文字列は整数にメモリを割り当て、2 番目の文字列は 1000 で初期化します。プログラムでさらに必要がない場合に、 p に関連付けられているメモリを解放します。

于 2012-11-30T04:49:52.830 に答える