ポインタとC + +の第1回参照
ポインタと参照は、コンピュータ科学の2つの重要な概念です。 彼らは多くのプログラミング言語でドレスや少し異なるが、表示される治療法は基本的に同じです。 C + +では、ポインタのスキルが不可欠であると。
ポインタはデータの特殊なタイプは、そのこの種の目標を宣言された変数があります(またはしない)メモリ内のいくつかの他のデータに。 ポインタ変数は、メモリ内のもうひとつのアドレスを保持します。 このことは変数、定数、他の間でデータを設定すると、関数の開始することができます。
ポインタを宣言する
ポインタの宣言は、通常、変数名の前に*を付加することによって行われます。 表記は、多くの*型の名前を象徴その型に"ポインタ変数""の代わりに"ポインタを宣言していると言って接着剤を使用すると、それらは等価です。 例:
にint型のポインタ/ /。 ptr_num1 ; int型 * ptr_num1; / /あるいはので。 ptr_num2 ; int型 * ptr_num2; へのポインタダブル/ /。 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 ; 、* のPC、int 型一文字 cは、* pi の 、 ダブルD、* Pdを/ / sizeof演算子は、引数のその型のサイズは言う。裁判所<< の文字サイズ":"<<sizeof演算 (c)の <<" <<ヒノキ; 裁判所 <<"サイズのint型"バイト:"<<sizeof演算 (1)<<"バイト"<<ヒノキ; 裁判所 <<"二重のサイズ:"<<はsizeof(d) の "<"バイト未満 <<ヒノキは、 裁判所の <はヒノキ未満; 裁判所 <<"cpは( サイズのchar *:"<<sizeof演算 ))π サイズのint *:"<<sizeof演算 ("バイト未満未満"<< ヒノキ; 裁判所 <<" <<"バイト"<< ヒノキは、 裁判所 <<" はsizeof < サイズ の2倍*"<(PD) は <<" ヒノキ バイト"<<; |
ポインタを使用して
彼の発言後、ポインタの内容は任意の変数のようにランダムな値、ゴミのメモリです。 それは便利な我々は彼に何かを与える必要があることにしてください。 ポインタがメモリアドレスを保持しているとして、我々はそれに有効なアドレスを割り当てる必要があります。
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int型のx、y; px, * py ; int型 *ピクセル、* のpy; ;はx = 13; ;はy = 10; x ;ピクセル=&Xの; y ; &パラグアイ= yの ; 42 ; * Pxは= 42; py ) ++ ; (*の Pyは )+ +; * px << endl ; 裁判所 <<*ピクセル<<ヒノキ。 * py << endl ; 裁判所 <<は、*パラグアイヒノキ未満<; ( * px ) * ( * py ) << endl ; 裁判所 <<(*ピクセル)*(*のpy)<< ヒノキ。 |
演算子&(アンパサンドまたはアンパサンド)アドレスアドレスを"、"彼の名前であるため、"前に、意味変数名は"
何が平等の左側にはまったく同じ種類のより平等の反対側ておくことができる必要があります。 ポインタを格納アドレス。 したがって、この場合にはポインタにアドレスを割り当てるには、あなたがアドレスを取得する必要があります&演算子です。
このような数値型との間の暗黙の型変換(である場合には)を除いて、変数何かに自分とは異なるタイプで、コンパイルエラーの原因を割り当てます。 幸いなことに!
ポインタ後すでにアドレス有効なポイントに、我々は(* 演算子で、このアドレスのことができますアクセスの内容をアスタリスク)を、その正式な名前は演算子です"とデリファレンス。"
注意してください内のアスタリスクは、そのポインタステートメントに"を意味するポインタ型の内容を書いて"とやの読み込みコンテキストで"を意味すると指摘して、コンテンツは"内容をのアドレス""または。 また、注意算術製品のシンボルを混同しないように。 その混乱を避ける覚えの演算子の優先順位テーブルを巨大な忘却、あなただけ渡さ目をに落ちたと。 そこには、デリファレンス演算子は、乗算演算子よりも優先さでしょう。 その後、演算子乗算されます覚えているドの前に評価基準演算子がいる。
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | pa, * pb ; int型 、b、cの* パは、*鉛 ; ; = 2; ; b = 3; a ;パ=&; b ;鉛=&b; pa * * pb ;のC = *パ*の 鉛; pa * * pb ;のC = *パ*の 鉛; pa * * pb ;のC = *パ*の 鉛; pa ** pb ;はC = *パ** 塩基; * pa ) * ( * pb ) ;はC =(*パ)*(*の 鉛); "Valor da Pegadinha: " << c << endl ; 裁判所 <<"値ガッチャの :"<<℃<<ヒノキ。 |
ですから、あなたは何がそれの内容を乗算と言うだろう例of最後の5行のいずれかになりますaskアルゴリズムのその証拠は、AP通信and bpのbyに指摘。 そのためこれ以上のピックのDPアップ! あなたは将来に本当に必要な場合と破壊、生命リアルタイムでthisを過去の世代を保存し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 | int型 、b; pa, * pb ; int型 *パは、* 鉛; "Antes de qualquer atribuição: \n " ) ; のprintf(" 代入する前にすべてのです:\ n"); "&a = %p \n " , & a ) ; // Endereço válido dado pelo SO. のprintf("&=%p のする\ n"、&)/ / 有効は、OSによってアドレス指定された。 "&b = %p \n " , & b ) ; // Endereço válido dado pelo SO. のprintf("&b =%pのする\ n"、&b)/ /有効は、OSによってアドレス指定された。 "&pa = %p \n " , & pa ) ; // Endereço válido dado pelo SO. のprintf("& パ=%pのは\ n"、& パ )/ /有効は、OSによってアドレス指定された。 "&pb = %p \n " , & pb ) ; // Endereço válido dado pelo SO. のprintf("& 鉛=%pのは\ n"、&bp) を/ /有効は、OSによってアドレス指定された。 " \n " ) ; の printf("する\ n"); "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("パ =%pの\ n"の、 パ )/ /コンテンツのランダムな初期化()。 "pb = %p \n " , pb ) ; // Conteúdo não inicializado (aleatório). の printf("塩基 =%pのする\ n"、 鉛); / /コンテンツ初期化(ランダム)。 / /実行してくださいコメントを外して次の行は、再コンパイルします。 / / printf関数("*パ=%d個の\ n個の"*パ)/ /何)です(ランダム*? / / printf関数("*の鉛=%d個の\ n"の、*の鉛)/ /何)です(ランダム*? " \n Após as inicializações dos ponteiros: \n " ) ; のprintf(" へのポインタの初期化後にする\ n です:\ n"); a ;パ=&; b ;鉛=&b; "&a = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. のprintf("&=%p のする\ n"、&)/ /偶数 有効なアドレスのOS与えられた。 "&b = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. のprintf("&b =%pのする\ n"、&b)/ /も有効なアドレスのOS与えられた。 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. のprintf("& パ=%pのする\ n"、& パ); 有効でOSとしてのアドレスと同じ/ /。 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. のprintf("& 鉛=%pのする\ n"、&bp) を、 有効でOSとしてのアドレスと同じ/ /。 " \n " ) ; の printf("する\ n"); "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("パ =%pの\ n"の、 パ )/ /初期化コンテンツ(&)。 "pb = %p \n " , pb ) ; // Conteúdo inicializado (&b). の printf("塩基 =%pのする\ n"、 鉛); / /コンテンツは&初期化(b)。 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a). のprintf("* パ=%d個の\ n個の"* パ)/ /コンテンツに指摘AP通信が(*パは== 1)。 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b). の printf("*の鉛=%d個の\ n"の、* の 鉛)/ /コンテンツに指摘bpで(bpの== * b)。 " \n Após as inicializações dos inteiros: \n " ) ; のprintf(" の整数の初期化後にする\ n です:\ n"); ; = 10; ; b = 13; "&a = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. のprintf("&=%p のする\ n"、&)/ /偶数 有効なアドレスのOS与えられた。 "&b = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. のprintf("&b =%pのする\ n"、&b)/ /も有効なアドレスのOS与えられた。 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. のprintf("& パ=%pのする\ n"、& パ) アドレス指定で、有効なも/ /。 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. のprintf("& 鉛=%pのする\ n"、&bp) を、 有効でOSとしてのアドレスと同じ/ /。 " \n " ) ; の printf("する\ n"); "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("パ =%pの\ n"の、 パ )/ /初期化コンテンツ(&)。 "pb = %p \n " , pb ) ; // Conteúdo inicializado (&b). の printf("塩基 =%pのする\ n"、 鉛); / /コンテンツは&初期化(b)。 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a == 10). のprintf("* パ=%d個の\ n個の"* パ)/ /コンテンツに指摘AP通信が(*パ== 1 == 10)。 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b == 13). の printf("*の鉛=%d個の\ n"の、* の 鉛)/ /コンテンツが)*の指摘で鉛フリー(Pb == b == 13。 " \n Alterando os valores através dos ponteiros: \n " ) ; の printf("する\ nポインタを介して値を変更する:\ nを"); 7 ; *パ= 7; 42 ; * BP社= 42; "&a = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. のprintf("&=%p のする\ n"、&)/ /偶数 有効なアドレスのOS与えられた。 "&b = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. のprintf("&b =%pのする\ n"、&b)/ /も有効なアドレスのOS与えられた。 "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. のprintf("& パ=%pのする\ n"、& パ); 有効でOSとしてのアドレスと同じ/ /。 "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. のprintf("& 鉛=%pのする\ n"、&bp) を、 有効でOSとしてのアドレスと同じ/ /。 " \n " ) ; の printf("する\ n"); "a = %d \n " , a ) ; // Conteúdo inicializado (a == *pa == 7). のprintf("=%d 個の\ n"を); / / コンテンツは、PAの初期化(※== 1 == 7)。 "b = %d \n " , b ) ; // Conteúdo inicializado (b == *pb == 42). のprintf("b =%dは\ n"の、b)/ /コンテンツは(初期化b == *の鉛== 42)。 "pa = %p \n " , pa ) ; // Conteúdo inicializado (&a). の printf("パ =%pの\ n"の、 パ )/ /初期化コンテンツ(&)。 "pb = %p \n " , pb ) ; // Conteúdo inicializado (&b). の printf("塩基 =%pのする\ n"、 鉛); / /コンテンツは&初期化(b)。 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa ( 7). のprintf("* パ=%d個の\ n"のは、* パ)/ /は、コンテンツ)が任命パ7(。 "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (42). の printf("*の鉛=%d個の\ n"の、* の 鉛)/ /コンテンツに指摘bpで(42)。 |
線は午前18時19 respectivamneteは2つの整数と整数に2つのポインタを宣言します。
行23-26を見る私の変数のアドレスを。 これらのアドレスは、オペレーティングシステムによって与えられたこれらの変数が存在する中で修正される。 変数は、プログラムの中に、しかし、アドレスを変更しない1つの実行と他の間で変更することができます。 誰が何そのアドレスは、プログラムの実装時のオペレーティングシステムを定義します。 コンパイラは、そのxバイトは、それぞれの変数と解釈(スタイル)のためのプログラムがその領域を与える必要が知っている。
行30-33を見る初期化されていないこれらの変数の内容。 それはゴミ、最後の値は、誰かが(人)は、コンピュータのメモリにそれらの場所を入れているかわからない今、私の変数に帰属します。
それが安全なラインに36のコメントを解除することはできませんし、37人のコンテンツにアクセスしようととして注意してくださいapとbpの、初期化されていないのを指摘した。 彼らはランダムな変数が有効なアドレスをintゴミしたかのように、この試みでは、プログラムはこれらの値を解釈しようとします。 コンパイラに応じて、OSが使用さ彼らの運命は無害かどうか可能性があります。 何が確かなことはこれらの行の結果が予測と問題点の確認、ソースです。
行41と42のポインタで整数型の変数のアドレスで初期化さaとb それ以来、繰り返されて印刷されます。
変更しないでくださいポインタのアドレスを参照してください、何が期待された。 何がその内容を変更されます。 変数のPAとPBはaとbはそれぞれのアドレスを表示します。 その手の内容は、変数の正確アドレスの値であることに注意し、OSによってプログラムの冒頭に与えられたb。 上記の出力確認してください。 コンテンツはAP通信がするとbp指摘同じ内容とb、初期化されていないか、ゴミです。 しかし、前の手順とは異なり、現在のポインタは、有効なアドレス(のアドレスを指すようにaとb)と、aとbは、ごみのメモリへのポインタ、現在すでに割り当てられている変数を指すようにさの内容。
行61と62の整数変数の値10と13、繰り返さで初期化されて出力されます。
今回aとbは、もはやジャンクいるのcoteúdos。 値が正しく知られている。 がある変数の前のステップに相対値のみアドレスに変更がないことに注意。
また、aとbが初期化された後にそれを参照してください、内容はAPとbpでの指摘も自動的に変更されている。 これが起こるため、正確paのpbとポイントが同じメモリ領域変数PAと鉛で使用される。 これは、コンテンツがへのポインタ、元の変数の内容を変更することによって変更することができます指摘means彼は指摘した。 そして最後に、行81-97を見るは、逆も真、すなわち、コンテンツはポインタが指して変化している、自動的に元の変数の彼らが指摘した内容を変更します。
これは、コードを見てもポルトガル語でのフレーズでこの考え方を理解しやすくなります。
今のところは...
これは、ポインタの基本的な操作をした。 、例えば、それは、より高度なトピックと考えられるが、まだ面白いものが関数へのポインタとして見られるようにされます。 4本のポストに計画され、このシリーズに続いて、参照、類似点とポインタと参照、最終的に関数へのポインタの違いを参照してください。
リンク
- ponteiros.zip (ポストのすべてのソース);
- 01 - declaracao.cpp
- 02 - tamanhos.cpp
- 03 - utilizando.cpp
- 04 - pegadinha.cpp
- 05 - enderecos.cpp
- cplusplus.comのポインタ
- ギルティギア
コメント
- ブルーノ
- くだらないおしゃべりをする
- フェルナンド


