>> C言語入門トップに戻る
今回は難しいとよく言われているポインタについて説明します。
そんなに難しくないので頑張ってついてきてください。
文字列の回で、少しポインタについて触れましたが、
ポインタと言うのは、変数のアドレス(場所)を持つ変数のことです。
例えば、
char test;
と変数を宣言したとしましょう?
こう宣言するとまずメモリ上にこの変数の領域が確保されます。
そのメモリが確保された場所を示す変数がポインタというわけです。
変数のアドレス場所を表すには、
変数名の頭に&をつけるだけです。
testという変数であれば、&testでその変数のアドレスを表すことが出来ます。
scanf等の色々な関数で、このアドレスを渡すことによって処理が行われます。
また、ポインタ型というのもあります。
この型は、変数のアドレスを保存しとくための型です。
宣言方法はこうです。
二通りあって、型の後ろにアスタリスク(*)をつけるか、変数名の前につけるかのどちらかです。
このように宣言した変数は、ある変数のアドレスを記憶することができます。
たとえば、下記のコードを実行してみてください。
これを実行すると「あいうえお」と表示されます。
test=bufのところで、
char型のポインタtestにbufの先頭アドレスを代入しています
つまりこの時点で、
buf(または&buf[0])とtestは同じアドレスの場所の値を保持していることになります。
最後にそのchar型ポインタ変数testをprintfの第二引数に指定して、
表示しています。
以前までだったら、bufを指定してたと思いますが、
そのアドレスをtestに代入したので、testの変数を使っても文字が表示できるわけです。
それ以外の型でも同じです。
例えば、下記のようなコードを見てください。
int型のポインタpointerに変数テストのアドレスを&testで代入しています。
これでpointerには変数testのアドレスが入っているわけです。
ここまではOKですよね。
ですが、その次のprintf関数では先程とはちょっと違います。
printfの第二引数は、
文字列に関してはその配列の先頭ポインタを指定すれば良かったのですが、
その他の型の変数はアドレスではなくて、直接値を指定してやる必要があります。
pointerとだけ書いた場合はアドレスを指定したことになってしまうので、
前にアスタリスク(*)をつけてやります
こうすることで、
pointerのアドレスの先にある値を読み込むことが出来ます
pointerのアドレスにはtestのアドレスが入っています。
そのアドレスの先にある値は100です。
ですので、*pointerとしてやると、その100の値を読み込んで表示してくれるわけです。
そのほかの型も、アドレスではなく、その先の値を読み込む場合は、
アスタリスクをつけて表示します。
また、読み込みができたと言うことは値の書き換えもできます。
次のコードを見てください。
これを実行すると「500」と表示されます。
まず、ポインタ変数pointerに変数testのアドレスを代入してます。
で、次に、
*pointer=500;
と書いて、ポインタ変数pointerが指す変数の書き換えを行っています。
このように、ポインタ変数にある変数のアドレスを入れておき、
*pointer=値
と書くことによって、ポインタが指す値を書き換えることができるのです。
つまり今回は、変数testの値を書き換えました。
その証拠に最後のprintfで、変数testを表示すると「500」と表示されました。
初期値は100だったので、間違いなく書き換えられてることが分かります。
このようにポインタを使えば、そのアドレスが指す値の読み込み、書き込みも可能というわけです。
大体ポインタの基礎はこんなところです。
理解できましたでしょうか?
次回は構造体について説明します。
>> 【構造体について】に進む
>> C言語入門トップに戻る
ポインタについて
そんなに難しくないので頑張ってついてきてください。
文字列の回で、少しポインタについて触れましたが、
ポインタと言うのは、変数のアドレス(場所)を持つ変数のことです。
例えば、
char test;
と変数を宣言したとしましょう?
こう宣言するとまずメモリ上にこの変数の領域が確保されます。
そのメモリが確保された場所を示す変数がポインタというわけです。
変数のアドレス場所を表すには、
変数名の頭に&をつけるだけです。
testという変数であれば、&testでその変数のアドレスを表すことが出来ます。
scanf等の色々な関数で、このアドレスを渡すことによって処理が行われます。
また、ポインタ型というのもあります。
この型は、変数のアドレスを保存しとくための型です。
宣言方法はこうです。
char* test; char *test;
二通りあって、型の後ろにアスタリスク(*)をつけるか、変数名の前につけるかのどちらかです。
このように宣言した変数は、ある変数のアドレスを記憶することができます。
たとえば、下記のコードを実行してみてください。
#include <stdio.h> int main(void){ char buf[50]="あいうえお"; char *test; //配列bufの先頭アドレスをtestへ代入 test=buf; printf("%s",test); return 0; }
これを実行すると「あいうえお」と表示されます。
test=bufのところで、
char型のポインタtestにbufの先頭アドレスを代入しています
つまりこの時点で、
buf(または&buf[0])とtestは同じアドレスの場所の値を保持していることになります。
最後にそのchar型ポインタ変数testをprintfの第二引数に指定して、
表示しています。
以前までだったら、bufを指定してたと思いますが、
そのアドレスをtestに代入したので、testの変数を使っても文字が表示できるわけです。
それ以外の型でも同じです。
例えば、下記のようなコードを見てください。
#include <stdio.h> int main(void){ int test=100; int *pointer; pointer=&test; printf("%d\n",*pointer); return 0; }
int型のポインタpointerに変数テストのアドレスを&testで代入しています。
これでpointerには変数testのアドレスが入っているわけです。
ここまではOKですよね。
ですが、その次のprintf関数では先程とはちょっと違います。
printfの第二引数は、
文字列に関してはその配列の先頭ポインタを指定すれば良かったのですが、
その他の型の変数はアドレスではなくて、直接値を指定してやる必要があります。
pointerとだけ書いた場合はアドレスを指定したことになってしまうので、
前にアスタリスク(*)をつけてやります
こうすることで、
pointerのアドレスの先にある値を読み込むことが出来ます
pointerのアドレスにはtestのアドレスが入っています。
そのアドレスの先にある値は100です。
ですので、*pointerとしてやると、その100の値を読み込んで表示してくれるわけです。
そのほかの型も、アドレスではなく、その先の値を読み込む場合は、
アスタリスクをつけて表示します。
また、読み込みができたと言うことは値の書き換えもできます。
次のコードを見てください。
#include <stdio.h> int main(void){ int test=100; int *pointer; pointer=&test; //ポインタ変数を使って値を書き換え *pointer=500; printf("%d\n",test); return 0; }
これを実行すると「500」と表示されます。
まず、ポインタ変数pointerに変数testのアドレスを代入してます。
で、次に、
*pointer=500;
と書いて、ポインタ変数pointerが指す変数の書き換えを行っています。
このように、ポインタ変数にある変数のアドレスを入れておき、
*pointer=値
と書くことによって、ポインタが指す値を書き換えることができるのです。
つまり今回は、変数testの値を書き換えました。
その証拠に最後のprintfで、変数testを表示すると「500」と表示されました。
初期値は100だったので、間違いなく書き換えられてることが分かります。
このようにポインタを使えば、そのアドレスが指す値の読み込み、書き込みも可能というわけです。
大体ポインタの基礎はこんなところです。
理解できましたでしょうか?
次回は構造体について説明します。
>> 【構造体について】に進む
>> C言語入門トップに戻る