ポインタとCの参照+ +パート1

2009年4月19日- Ĉで掲示される/ C + +の

ポインタと参照のコンピュータ科学の2つの重要な概念です。 彼らは多くのプログラミング言語でのドレスや少し異なると、表示されるが、基本的に治療法は同じです。 C + +では、とポインタのスキルが不可欠です。

ポインタのデータを特殊なタイプの場合、変数を持つこの種の目的と宣言された可能性があります(またはしない)メモリ内のいくつかの他のデータです。 ポインタ型の変数をメモリ内にあともう一つのアドレスを保持します。 変数、定数をすることができます、このことは、他の人の間でデータを設定すると、関数の始まり。

ポインタを宣言する

ポインタの宣言は通常、*は、変数名の前に追加することによって行われます。 表記法をはるかに接着剤を使用*型の名前を象徴的に、そのタイプに"の代わりに"ポインタ変数"a"ポインタを宣言していますが、それらは等価であると言って。 例えば:

  / /ポインタをint型に。
 ptr_num1 ; int * ptr_num1;

 / /あるいはので。
 ptr_num2 ; int * ptr_num2;

 / /ポインタを2倍にする。
 ptr_double1 ; ダブル* ptr_double1;

 / /あるいはので。
 ptr_double2 ; ダブル* ptr_double2; 

宣言した後、ポインタとサイズですので、メモリ内で行われます。 ポインタのサイズは、通常のマシンのビット数に等しい/問題のシステムは、32ビットの例は、4バイトです。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 pc ; int i, * pi ; double d, * pd ; // O operador sizeof diz o tamanho do tipo do seu argumento. cout << "Size of char:    " << sizeof ( c ) << " bytes" << endl ; cout << "Size of int:     " << sizeof ( i ) << " bytes" << endl ; cout << "Size of double:  " << sizeof ( d ) << " bytes" << endl ; cout << endl ; cout << "Size of char*:   " << sizeof ( pc ) << " bytes" << endl ; cout << "Size of int*:    " << sizeof ( pi ) << " bytes" << endl ; cout << "Size of double*: " << sizeof ( pd ) << " bytes" << endl ; char cを 、* のPCは、INT私は、*π、 ダブルD、* パラジウム; / / sizeof演算子は引数の型のサイズだ。 裁判所は "char型の""サイズ:"""sizeof(℃)"""バイト"""endl 裁判所は "int型の""サイズ:"""sizeof(1)"""バイト"""endl 裁判所は "2""サイズ:"""sizeof(  )""""バイト ""endl 裁判所 ""endl 裁判所は " 文字*の""サイズ:"""sizeof( パーセク)""" バイト"""endl 裁判所は "int *の""サイズ:"""sizeof(pi)  """"""endl 裁判所は " バイト""のサイズ*"二重 ""sizeof(PD) """"""endlバイト ; 

ポインタの使用

彼の文の後、ポインタの内容を任意の変数のようにランダムな値は、メモリの無駄です。 のために我々は彼に何かをする必要が有用であることを。 としてのポインタのメモリアドレスを保持し、我々は、有効なアドレスを割り当てます。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
  int Xのイン;
 px, * py ; int * pxまたは* 坪;

 ; Xの= 13;
 ;からy = 10;

 x ;ピクセル=&Xの;
 y ; = yを ;

 42 ; *ピクセル= 42;
 py ) ++ ; (* )+ +;

 * px << endl ; 裁判所は ""*ピクセル""endl;
 * py << endl ; 裁判所は ""*""endl;
 ( * px ) * ( * py ) << endl ; 裁判所は ""(* px)を*(* )""endl; 

演算子&(アンパサンドまたはアンパサンド)変数の意味の名前の前に"アドレス"なぜなら、彼の名前を"アドレス"です。

どのような平等の左には正確には、平等の反対側にいるのと同じ型を保持できるようにしています。 ポインタを格納するアドレスです。 というわけで、ポインタには、この場合にはアドレスを割り当てるには、あなたとアドレスを取得する必要がありますが、&演算子です。

場合を除きが暗黙の型変換(たとえば、数値型の間)として、何かに、そのコンパイルエラーの原因の異なるタイプの変数に代入されます。 幸いなことに!

ポインタが有効なアドレスを指すようにして、我々 )、その正式名称は、"演算子デ参照演算子*(アスタリスクと、そのアドレスの内容にアクセスすることができます。

その声明の中では、アスタリスク"タイプ"を読んだり 、ポインタの内容を書いているコンテキスト内でポインタを意味する"アドレス"または"コンテンツの内容を指すということに注意。" また、製品の算術演算のための記号と混同しないように注意すること。 演算子の優先順位は、 巨大なテーブルを覚えて先ほど目を通過し、忘却の淵に落ちたの混乱を避けるために。 ここでは、の演算子を参照する乗算演算子よりも優先さを見つける。 かつては、そんなこと演算子を参照する乗算演算子の前に評価され、覚えて行っている。

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  pa, * pb ; 、B、Cの、* paまで、* int;
 ; = 2;
 ;のB = 3;

 a ;=&;
 b ;=&b ;

 pa * * pb ; Ĉ = ** 鉛;
 pa * * pb ; Ĉ = ** 鉛;
 pa * * pb ; Ĉ = ** 鉛;
 pa ** pb ; Ĉ = * paまで** BP社;
 * pa ) * ( * pb ) ; Ĉ =(* paまで)*(* 鉛);

 "Valor da Pegadinha: " << c << endl ; 裁判所は """値豆知識:"""Ĉ""endl; 

だからときには何になります求めるアルゴリズムの証拠任意ば、その内容は、PAと鉛で指される乗算と言うだろう例の最後の5行です。 このためのPDをピックアップして下さい! そして、もし本当にこれを行うに必要な実際の生活の中で、ブレーキング、あなたは4世代に過去を保存すると5 破門の将来の場合は、最後の行を使用して選択します。

あなたがコンテンツを行うことができる共通の変数をすべて行うことができますへのポインタによって、いずれかの読み取りと指摘または書面(ただし、そのポインタがconstのは明らかですが、それは別の暴言...).の

アドレスとポインタ

次のコード例を挙げると:

  18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
  、Bのint;
 pa, * pb ; int * paまで、* 鉛;

 "Antes de qualquer atribuição: \n " ) ; printfの すべての割り当て(":\ Ñ");

 "&a  = %p \n " , & a ) ; // Endereço válido dado pelo SO. OSによって指定された printfの ("&=%p\ N"は、&)/ /有効なアドレスです。
 "&b  = %p \n " , & b ) ; // Endereço válido dado pelo SO. OSによって指定された printfの ("&bの=%pの\ N"は、&2)/ /有効なアドレスです。
 "&pa = %p \n " , & pa ) ; // Endereço válido dado pelo SO. printfの ("&パ=%pの\ N"は、&pa まで); OSによって指定された/ /有効なアドレスです。
 "&pb = %p \n " , & pb ) ; // Endereço válido dado pelo SO. printfの ("&鉛=%pの\ N"は、& 鉛); OSによって指定された/ /有効なアドレスです。

 " \n " ) ; printfの ("\ Ñ");

 "a   = %d \n " , a ) ; // Conteúdo não inicializado (aleatório). printfの ("=%d\ N"は、); / /初期化(ランダム)コンテンツ。
 "b   = %d \n " , b ) ; // Conteúdo não inicializado (aleatório). printfの  の"B =%d個\ N"は、b)  / /初期化(ランダム)コンテンツ。
 "pa  = %p \n " , pa ) ; // Conteúdo não inicializado (aleatório). printfの  の"pa =%pの\ N"は、 年率 )/ /初期化(ランダム)コンテンツ。
 "pb  = %p \n " , pb ) ; // Conteúdo não inicializado (aleatório). printfの ("血圧=%pの\ N"にはpb); / /初期化(ランダム)コンテンツ。

 / /以下は、次の行のコメントを外し再コンパイルして実行します。
 / / printfの("*年率=%d個\ N"は、* paまで)/ /どのようになります(*)のランダムな?
 / / printfの("*鉛=%d個\ N"は、*鉛); / /は何です(*)のランダムな?

 " \n Após as inicializações dos ponteiros: \n " ) ; ポインタの初期化後 、printfの ("\ム:\ Ñ");

 a ;=&;
 b ;=&b ;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. OSによって指定された printfの ("&=%p\ N"は、&); / /偶数の有効なアドレスです。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. OSによって指定された printfの ("&bの=%pの\ N"は、&b  )/ /偶数の有効なアドレスです。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printfの ("&パ=%pの\ N"は、&pa まで); / /偶数の有効なアドレスは、OSによって与えられる。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printfの ("&鉛=%pの\ N"は、& 鉛); / /偶数の有効なアドレスは、OSによって与えられる。

 " \n " ) ; printfの ("\ Ñ");

 "a   = %d \n " , a ) ; // Conteúdo não inicializado (aleatório). printfの ("=%d\ N"は、); / /初期化(ランダム)コンテンツ。
 "b   = %d \n " , b ) ; // Conteúdo não inicializado (aleatório). printfの  の"B =%d個\ N"は、b)  / /初期化(ランダム)コンテンツ。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). printfの  の"pa =%pの\ N"は、年利 )/ /初期化コンテンツ(&)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printfの ("血圧=%pの\ N"にはpb); / /コンテンツの初期化(&b)の

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a). printfの ("*年率=%d個\ N"は、* 年率); / /コンテンツpaまでで(* paまで==任命)。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b). printfの ("*鉛=%d個\ N"は、* 鉛); / /コンテンツに鉛が(*鉛== Bの指摘)。

 " \n Após as inicializações dos inteiros: \n " ) ; 整数の初期化後 、printfの ("\ム:\ Ñ");

 ; = 10;
 ;のB = 13;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. OSによって指定された printfの ("&=%p\ N"は、&); / /偶数の有効なアドレスです。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. OSによって指定された printfの ("&bの=%pの\ N"は、&b  )/ /偶数の有効なアドレスです。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printfの ("&パ=%pの\ N"は、&pa まで); / /偶数の有効なアドレスは、OSによって与えられる。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printfの ("&鉛=%pの\ N"は、& 鉛); / /偶数の有効なアドレスは、OSによって与えられる。

 " \n " ) ; printfの ("\ Ñ");

 "a   = %d \n " , a ) ; // Conteúdo inicializado (10). printfの ("=%d\ N"は、); / /コンテンツブーツ(10)。
 "b   = %d \n " , b ) ; // Conteúdo inicializado (13). printfの  の"B =%d個\ N"は、b)  / /コンテンツブーツ(13)。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). printfの  の"pa =%pの\ N"は、年利 )/ /初期化コンテンツ(&)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printfの ("血圧=%pの\ N"にはpb); / /コンテンツの初期化(&b)の

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a == 10). printfの ("*年率=%d個\ N"は、* 年率); / /コンテンツpaまでで(* paまで== == 10)を任命した。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b == 13). printfの ("*鉛=%d個\ N"は、* 鉛); / /コンテンツに鉛が(*鉛== Bの== 13)と指摘した。

 " \n Alterando os valores através dos ponteiros: \n " ) ; printfの ("\ポインタをnを介して値を変更する:\ Ñ");

 7 ; *= 7;
 42 ; *= 42;

 "&a  = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. OSによって指定された printfの ("&=%p\ N"は、&); / /偶数の有効なアドレスです。
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. OSによって指定された printfの ("&bの=%pの\ N"は、&b  )/ /偶数の有効なアドレスです。
 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printfの ("&パ=%pの\ N"は、&pa まで); / /偶数の有効なアドレスは、OSによって与えられる。
 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printfの ("&鉛=%pの\ N"は、& 鉛); / /偶数の有効なアドレスは、OSによって与えられる。

 " \n " ) ; printfの ("\ Ñ");

 "a   = %d \n " , a ) ; // Conteúdo inicializado (a == *pa ==  7). printfの ("=%d\ N"は、); / /コンテンツを開始(== * paまで== 7)。
 "b   = %d \n " , b ) ; // Conteúdo inicializado (b == *pb == 42). printfの  の"B =%d個\ N"は、b)  / /コンテンツの初期化(イ== *鉛== 42)。
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). printfの  の"pa =%pの\ N"は、年利 )/ /初期化コンテンツ(&)。
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printfの ("血圧=%pの\ N"にはpb); / /コンテンツの初期化(&b)の

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa ( 7). printfの ("*年率=%d個\ N"は、* 年率); / /コンテンツpaまで(7)を任命した。
 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (42). printfの ("*鉛=%d個\ N"は、* 鉛); / /コンテンツ鉛(42)を指摘した。 

18行目と19日にrespectivamnete 2と2つのポインタへの整数を宣言した。

26日まで行23 my変数のアドレスを示しています。 これらのアドレスは、オペレーティングシステムによって授与され、固定されている間、それらの変数が存在する。 変数は、プログラムの中にもアドレスを変更していない1つの実行し、別の間で変更することができます。 誰が何をそのアドレスは、プログラムの時間では、オペレーティングシステムを定義します。 コンパイラのみをxバイト、それぞれの変数は、との解釈(スタイル)は、プログラムは、このスペースを与えるのに必要な知っている。

行30 33を見るには、初期化されていないが、これらの変数の内容を示します。 それはゴミの最後の値は誰か)コンピュータのメモリにそれらの場所を入れて、今私の変数に属しているか分からない(ありません。

は、行36のコメントを解除しても安全であることに注意し、37としては、コンテンツにアクセスしようとすると、PAと鉛は、初期化されていないのを指摘した。 この試みでは、プログラムの場合は、変数のアドレスがあるとしても有効intランダムなごみのそれらの値を解釈しようとします。 コンパイラによっては、OSや、彼らの運命かどうか無害かもしれませんが使用されます。 どのような特定されているこれらの行の結果が予測され、問題の確認ソースです。

行41と42は、ポインタは、整数型の変数のアドレスで初期化され、aとb その後、印刷が繰り返されます。

には、ポインタのアドレスが、何が期待された変更しないでください。 どのような変化し、その内容です。 変数paまでと鉛のアドレスを受信するとbはそれぞれ。 その手の内容を正確には、変数のアドレスの値であることに注意aとbは、プログラムの冒頭には、OSによって与えられた。 チェックの上、プリントした。 コンテンツは、PAと鉛で指されるのは、同じコンテンツが、aとbは、すなわち、ごみに初期化されていない。 しかし、前の手順とは異なり、現在のポインタを有効なアドレスをaとb(アドレス)とするために、aとb今では割り当てられている変数をポイントしてゴミのメモリへのポインタですの内容。

行61と62の整数型の変数に値を10と13で、初期化されているプリントを再度繰り返した。

この時、aとbは多くのガベージているのcoteúdos。 値が正しく知られている。 は、そこには変更はありません注:アドレスは、前のステップの値のみに関連する変数です。

後、aとbが初期化されているを参照しても、その内容は、PAと鉛によって指摘も自動的に変更された。 これが発生するため、正確にメモリ変数paまでとPbで使用されるのと同じ地域には、PAと鉛ポイントします。 これは、コンテンツへのポインタは、元の変数の内容を変更することによって変更することができます指摘した彼が指摘したということです。 そして最後に、行81から97を見るには、逆も、すなわち、内容の変更がtrueの場合へのポインタによって、自動的にそれらの指摘は、元の変数の内容が変化すると指摘した。

これは、コードを見てもポルトガル語でのフレーズについては、この考え方を理解することが簡単です。

今のところは...

このポインタを使用して基本的な操作されました。 まだ関数へのポインタとして見られるのは興味深いものが、たとえば、がのために、より高度なトピックと見なされます。 は4の投稿を予定されて、このシリーズは、以下を参照し、相違点と、ポインタと参照と最後に関数へのポインタとの間の類似してください。

リンク

コメント

5レスポンスを"ポインタとC言語で参照+ +パート1"

  1. ポインタと参照は、ポインタの話を始めたの記事のシリーズではこの試みを[...]では、今日の議論[...]

  2. [...] [...] PointeirosとReferences

  3. [...]このシリーズの最初のポストは、ポインタを少し話す。 2番目では、参照について話しています。 今日、我々の親密な関係に(UIを!)ポインタとの間に焦点を当てる[...]

  4. フェルナンド2009年12月26日午前18時50分に

    おい、どのようにそのように投稿すると、コードの投稿を私に教えることがありますか?
    内部ボックス特に、ラインのマーキングとは、言語のキーワード強調?

  5. 12月にぶちまける月28日8時48分

    問題ありません!

    WordpressのプラグインをWPのと呼ばれる、構文、どのシーン下司の背後を使用しています

    一度preタグ内のコードを配置できますが、属性は、"言語"と"行"を追加インストールされます。 言語は自己説明して、ドキュメントの言語のリストを持って、その行の開始行です。

    下司また、ウィキでこの機能を追加するために悪用されることができます。

    ヒント:前にコピーして、コードを貼り付けると、4つのスペースで、すべてのタブに置き換えます。 これは、コードのスタイル]タブに適用される依存しないようにします。

    抱擁

返信コメントを残す




WPのHashCashので電源