2016-05-01 7 views
1

私はプログラミングに慣れていないので、私は「ポインタ」という考え方で頭を抱えています。ポインターの(アスタリスク)の目的は正確に何ですか?


int main() 
{ 
    int x = 5; 
    int *pointerToInteger = & x; 
    cout<<pointerToInteger; 

} 

なぜそれが私がcout << pointerToInteger;ときに出力がhexdecimal値であるが、私はcout << *pointerToInteger;を使用する場合、出力は、5(X = 5)であることです。

+0

1つはポインタ(つまりメモリアドレス)です。これは16進値です。もう1つはそのアドレスの内容です。 –

+0

ポインタの前にある '*'は、ポインタの「参照解除」を意味するか、それをトラバースすることを意味します。型の後の '*'は型へのポインタを示します。ポインタとは、情報が格納されているメモリのどこかへの方向にすぎません。 –

+0

'cout << pointerToInteger'は' pointerToInteger'が指すアドレスを表示します。 'cout << * pointerToInteger'はそのアドレスに格納されている* contents *を出力します。これを次のように考えてみましょう: 'pointerToInteger'はあなたの家の前にあるメールボックスです。 '* pointerToInteger'はそのメールボックスの中身です。 –

答えて

11

*は、文脈によって異なる意味を有する。発現のポインタ逆参照

  1. ポインタの宣言

    int* ap; // It defines ap to be a pointer to an int. 
    
    void foo(int* p); // Declares function foo. 
            // foo expects a pointer to an int as an argument. 
    
  2. int i = 0; 
    int* ap = &i; // ap points to i 
    *ap = 10;  // Indirectly sets the value of i to 10 
    
  3. 乗算演算子。

    int i = 10*20; // Needs no explanation. 
    
2

あなたには、いくつかの型の変数を宣言した場合は、また、それに別の変数のポインティングを宣言することができます。例えば

int a;

int* b = &a;

だから本質的には、それぞれの基本的なタイプのために、我々はまた、対応するポインタ型を持っています。

たとえば、shortおよびshort*です。

(それはおそらく最も初心者を混乱させる何)変数b「見」するには、2つの方法があります。

  • あなたがタイプint*の変数としてbを考慮することができますが。

  • *bは、タイプintの変数として考えることができます。

    したがって、int* bと宣言する人もあれば、int *bと宣言する人もいます。

    しかし、実際には、これらの2つの宣言は同じです(スペースは無意味です)。

    bを整数値へのポインタとして使用するか、実際に指し示された整数値として*bを使用できます。

    狙った値:int c = *bを取得(読み取り)できます。

    そして、指し示された値:*b = 5を設定(書き込む)することができます。


ポインタは、以前に宣言したことを任意のメモリアドレスに、とだけでなく、いくつかの変数のアドレスを指すことができます。ただし、ポインティングされたメモリアドレスにある値を取得または設定するためにポインタを使用する場合は注意が必要です。例えば

:ここ

int* a = (int*)0x8000000;

、我々はメモリアドレス0x8000000に変数aポインティングを持っています。

このメモリアドレスがプログラムのメモリ空間内にマップされていない場合、メモリアクセス違反のために*aを使用する読み取りまたは書き込み操作は、プログラムがクラッシュする可能性があります。

aの値を安全に変更することはできますが、*aの値を変更する際は非常に注意が必要です。それを見て

3

一つの方法は、あなたのソース/コード内の変数は、

int a=0; 

が行うと言うことです「int型」我々は新しい変数を作成する場合は、メモリ内の値に0を参照してください。 、この時間は(潜在的に小さい) "int型のポインタ"、int *、それは&我々は0を得る

int*p_a=&a; //(`p_a` meaning pointer to `a` see hungarian notation) 

hungarian notation wiki

(Aのアドレス)を指していは、値&aの値を指します。 aのアドレスに何があるのか​​、* p_aは&(aのアドレス)にあるものへのポインタです。

これは、重複したコンテナを作成せずに、メモリ内の値を変更する場合に使用します。

p_a自体はいただきましたが、あなたが、ポインタのアドレスが何であれない書き込みますcout<<p_a<<endl;ただし、メモリフットプリント(潜在的により小さいa自体)とするとき、あなたを持っています。 *p_aがありますが、&aになります。

p_aは、通常はメモリへのポインタであり値自体ではないため、通常はaより小さくなります。それは理にかなっていますか?ポインターのベクトルは、値のベクトルよりも管理が容易ですが、多くの点で同じことをします。

関連する問題