C++スコーラ
ポインタ
最終更新:
cschola
-
view
結構長いですが、C言語の中核をなす大事な部分です。
何度も繰り返し学習して、自分のものにしましょう。
何度も繰り返し学習して、自分のものにしましょう。
第1項 ポインタ
今回はポインタについて説明します。ポインタとは「メモリ」上の「アドレス」を格納できる変数です。
「メモリ」とはPCの記憶領域です。
「アドレス」は「場所を示す」ものです。住所や郵便番号のようなものです。
「メールアドレス」といえばメールの行きつく「場所を示す」ものですね。
前回までのプログラムで変数を使ってきました。
変数を宣言するとその変数の型の大きさのに合わせた領域が「メモリ」上に確保されます。
「メモリ」上のどの場所が確保されるのかはわかりません。
使える場所をコンピュータが適当に選んで割り当てます。
「メモリ」上のどの場所に割り当てられたのか、それを示すのがアドレスです。
「メモリ」とはPCの記憶領域です。
「アドレス」は「場所を示す」ものです。住所や郵便番号のようなものです。
「メールアドレス」といえばメールの行きつく「場所を示す」ものですね。
前回までのプログラムで変数を使ってきました。
変数を宣言するとその変数の型の大きさのに合わせた領域が「メモリ」上に確保されます。
「メモリ」上のどの場所が確保されるのかはわかりません。
使える場所をコンピュータが適当に選んで割り当てます。
「メモリ」上のどの場所に割り当てられたのか、それを示すのがアドレスです。
アドレスを見る
次のプログラムを書いて、実行する前に今まで書いてきたプログラムとの違いを探してみましょう。
int num = 10; printf("numの値は%dです。\n",num); printf("numのアドレスは%pです。\n",&num);
実行してみると上一行には今までと同じように num の値が表示され、
下の一行には数字とアルファベットが表示されています。
これは16進数で示されるアドレスです。
メモリ上のどの場所にデータが格納されているのか示します。
変数は必ずアドレスを持っていて、変数名の前に & を付けることでその変数のアドレスを得ることができます。
double型 や char型の変数もアドレスを持っています。
下の一行には数字とアルファベットが表示されています。
これは16進数で示されるアドレスです。
メモリ上のどの場所にデータが格納されているのか示します。
変数は必ずアドレスを持っていて、変数名の前に & を付けることでその変数のアドレスを得ることができます。
double型 や char型の変数もアドレスを持っています。
練習問題
次のようなプログラムを作ってください。
第1問
double型の変数を宣言して、そのアドレスを表示する。
第2問
char型の変数を宣言して、そのアドレスを表示する。
第1問
double型の変数を宣言して、そのアドレスを表示する。
第2問
char型の変数を宣言して、そのアドレスを表示する。
第二項 アドレスを格納する変数
前項で画面に表示したアドレスは変数に格納することができます。
アドレスを格納する変数をポインターといいます。
ポインターは次のように宣言します。
アドレスを格納する変数をポインターといいます。
ポインターは次のように宣言します。
int num = 0; //int型変数numの宣言 int* p = # //int型ポインターの p を宣言
今回は int型の num のアドレスを格納しています。
ポインターは 格納したい変数の型に * を付けて宣言します。
* の位置は int* p でも int *p でも宣言できます。
double型 の変数のアドレスを格納したい場合は double* と書きます。 char型も同様です。
ポインターに変数のアドレスを格納すると、ポインターからその変数にアクセスできるようになります。
ポインターの名前に * を付けることでアクセスできます。
ポインターは 格納したい変数の型に * を付けて宣言します。
* の位置は int* p でも int *p でも宣言できます。
double型 の変数のアドレスを格納したい場合は double* と書きます。 char型も同様です。
ポインターに変数のアドレスを格納すると、ポインターからその変数にアクセスできるようになります。
ポインターの名前に * を付けることでアクセスできます。
int num = 0; int* p = # printf("numの値は%d\n",num); *p = 10; //pからnumにアクセスしてnumの値を変更 printf("numの値は%d\n",num); //numの値を表示 printf("numの値は%d\n",*p); //pからnumにアクセスして numの値を表示 printf("numのアドレスは%p\n",p);
この使い方は double型 や char型でも同じです。
ポインターは、 int* p = # のように宣言と同時に初期化しましょう。
初期化していないポインターはどこのアドレスを指しているかわからず、危険なふるまいをする可能性があります。
ポインターは、 int* p = # のように宣言と同時に初期化しましょう。
初期化していないポインターはどこのアドレスを指しているかわからず、危険なふるまいをする可能性があります。
練習問題
次のようなプログラムを作ってください。
第1問
double型の変数を宣言し、そのアドレスをポインターに格納して、
ポインターから変数にアクセスして数値を代入し表示する。
第2問
char型の変数を宣言し、そのアドレスをポインターに格納して、
ポインターから変数にアクセスして文字を代入し、ポインターから参照して表示する。
第1問
double型の変数を宣言し、そのアドレスをポインターに格納して、
ポインターから変数にアクセスして数値を代入し表示する。
第2問
char型の変数を宣言し、そのアドレスをポインターに格納して、
ポインターから変数にアクセスして文字を代入し、ポインターから参照して表示する。