2009-05-22 10 views
8

宣言の値にポインターを割り当てることはできますか?このような何か:C++でポインターを初期化する

int * p = &(1000) 
+4

絶対アドレス、つまり組み込みシステムに設定しようとしていますか?それは答えに大きな違いをもたらします。 –

+1

確かに、あなたが探しているものを推測するのは難しいです...私はあなたがポインタ上で新しく、言葉の用語を混乱させると思います。誰もがどこかで始まらなければなりません。 :-) –

答えて

22

はい、あなたはしかし、あなたが行うことができない、宣言で値へのポインタを初期化することができます。

int *p = &(1000); 

&はオペレータのアドレスであり、あなたがすることはできませんそれを定数に適用してください(可能であれば、それは興味深いでしょう)。別の変数を使用してみてください:

int foo = 1000; 
int *p = &foo; 

またはタイプキャスト:

int *p = (int *)(1000); // or reinterpret_cast<>/static_cast<>/etc 
+2

文字列定数は特殊なケースですか?それは "const char *"である必要があります... – dmckee

+3

はい、文字列リテラルは、lvalue式で、配列オブジェクト(ポインタではありません)を参照する点で特別です。あなたは 'char const * p =& "hello there" [0];'のようにchar const *を初期化しています。 –

+0

それは動作しません、私は試しましたが、いくつかのガベージタイプの値を示しています。 ** 'int * p =(int *)100;' **。 ** 000003E8' ** – Ravi

2

うーん。私はあなたがそのような定数の非constアドレスを取ることができるとは思わない。

が、これは動作します:

int x = 3; 
int *px = &x; 
cout << *px; // prints 3 

またはこの:

const int x = 3; 
const int *px = &x; 
const int *pfoo = reinterpret_cast<const int*>(47); 
4

何について:

// Creates a pointer p to an integer initialized with value 1000. 
int * p = new int(1000); 

テストおよび作品を。 ;-)

+3

しかし、削除することを忘れないでください! – GManNickG

7

質問には2つの不明点があります。ポインタを特定の値(つまりアドレス)に設定するか、ポインタを特定の変数に設定しますか?

後者の場合、address-of演算子を使用できます。ポインタのは、のアドレスsome_int_variableに設定されます。

int *p = &some_int_variable; 
*p = 10; // same as some_int_variable = 10; 

次は何を手動でポインタの値の邪悪な変化です。あなたがそれをしたいかどうかわからない場合、あなたはそれをしたくありません。コンパイラはint型を取り、アドレスとしてそれを解釈しませんので、前者の場合(すなわち、いくつかの特定の、指定されたアドレスに設定)で

、あなただけ

int *p = 1000; 

を行うことはできません。

int *p = reinterpret_cast<int*>(1000); 

今、ポインタはアドレスで、結果は実装定義されていることを1000注意をいくつかの整数を(うまくいけば)参照します:あなたはそれが明示的に行う必要があり、コンパイラに指示する必要があります。それにもかかわらず、それはセマンティクスであり、コンパイラにそのことを伝える方法です。

更新:委員会は、ノートで示唆された奇妙な振る舞いを修正しました。そのために私は回避策を提供しました。 See here

関連する問題