C/C++プログラミング入門 – 配列においては配列について簡単に説明を行った。では、そろそろC言語及びC++における大きな鬼門の一つと言えるポインターについて説明を行いたい。ここではポインターの考え方と簡単なコードを交えて説明を行いたい。
ポインターとは
C言語及びC++におけるポインターとは、ある変数やオブジェクトなどの実際にある場所を指し示すものである。例えばこれまでの説明でも度々変数を使っていたが、これらはメモリーのどこかに格納されており、ポインターはその場所を指し示すことである。
なお、変数及びポインターは一定の書式に使いことで、それぞれ値とアドレスを渡すことが可能で、うまく使いこなすことができれば複雑なことも行えるようになる一方、値やアドレスなどの破壊を引き起こしかねないので、その点は気をつけなければならない。
サンプルコード
[code lang=”c”]#include <stdio.h>
int main() {
int num = 1; // 変数numを定義する
int *ptr = NULL; // ポインターptrを定義する
ptr = # // ptrにnumのアドレスを代入する
printf("numの値: %d\n", num); // numの値を出力する
printf("ptrの値: %d\n", *ptr); // ptrの値を出力する
*ptr = 2; // ポインターptrの参照先の値に2を代入する(この時にnumの値も暗黙的に書き換えられる)
printf("ptrの値: %d\n", *ptr); // ptrの値を出力する
printf("numの値: %d\n", num); // numの値を出力する
}
[/code]
出力結果
numの値: 1
ptrの値: 1
ptrの値: 2
numの値: 2
解説
これはまず、変数numに1を代入し、ポインターptrに変数numのアドレスを代入して、それぞれの値を出力している。
変数を格納しているアドレスを取得する場合は「&変数名」のように、変数名の前に「&」を追記する。
逆に、ポインターが指しているアドレスの値を取得する場合は「ポインター名」のように、変数名の前に「」を追記する。なお、「*」は乗算の演算記号としても使われているが、ここではポインターの参照先の値を意味しているので、混同しないようにすること。
なお、ここではptrにnumのアドレスを代入したため、実質的にnumとptrは同じ場所を参照するという状態になった。そのため、ptrの参照先の値を変更した時、ptrの参照先はnumの実際のアドレスと同じであるため、暗黙的にnumの値も書き換えられる形となった。
このため、ポインターは使い方を誤ると想定しえない結果を招くことがあるため、気をつけなければならないだろう。
最後に
今回はポインター及びアドレスについて、簡単な説明を行った。ポインターはC言語においてはほぼ必須の要素であるため、是非使いこなしたいところである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。