ポインタの理解を深めるためには、実際に動作するシンプルなC言語プログラムを通じて、ポインタの仕組みや使い方を体験するのが効果的である。
以下に、初心者向けのポインタ学習に役立つプログラムをいくつか紹介しよう。
① ポインタの基本:変数のアドレスを表示しよう!
#include <stdio.h>
int main(void)
{
int a = 10;
int *p = &a;
printf("aの値: %d\n", a);
printf("aのアドレス: %p\n", &a);
printf("pの値(aのアドレス): %p\n", p);
printf("*pの値(aの値): %d\n", *p);
return 0;
}
実行結果
aの値: 10
aのアドレス: 0x7ffefeb329dc
pの値(aのアドレス): 0x7ffefeb329dc
*pの値(aの値): 10
ポイント
*p はポインタが指す先の値を取得する。
② ポインタを使って値を変更しよう
#include <stdio.h>
void changeValue(int *p)
{
*p = 20;
}
int main(void)
{
int a = 10;
printf("変更前のa: %d\n", a);
changeValue(&a);
printf("変更後のa: %d\n", a);
return 0;
}
実行結果
変更前のa: 10
変更後のa: 20
②の別解
#include <stdio.h>
int main(void)
{
int a = 10;
printf("変更前のa: %d\n", a);
int *p = &a; // aのアドレスをポインタpに代入
*p = 20; // ポインタpが指す先(つまりa)の値を変更
printf("変更後のa: %d\n", a);
return 0;
}
ポイント
int *p = &a; で、変数 a のアドレスをポインタ p に渡している。
*p = 20; によって、ポインタ p が指す先の値(つまり a)を変更している。
関数を使わず、main関数内だけでポインタの基本的な使い方を示すシンプルな例である。
補足
このコードは、ポインタの基本的な使い方を学ぶ上で役立つ。
関数を使う場合は「他の関数から変数の値を変更する」目的になるが、今回のように main関数内でポインタを使って直接値を変更するのも、ポインタの理解を深めるために有効である。
③ 配列とポインタの関係
#include <stdio.h>
int main(void)
{
int arr[3] = {1, 2, 3};
int *p = arr;
for (int i = 0; i < 3; i++) {
printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
}
return 0;
}
実行結果
arr[0] = 1, *(p + 0) = 1
arr[1] = 2, *(p + 1) = 2
arr[2] = 3, *(p + 2) = 3
ポイント
配列名はポインタとして扱われ、*(p + i) で配列の要素にアクセスできる。
④ ポインタのポインタ(二重ポインタ)
#include <stdio.h>
int main(void)
{
int a = 5;
int *p = &a;
int **pp = &p;
printf("a = %d\n", a);
printf("*p = %d\n", *p);
printf("**pp = %d\n", **pp);
return 0;
}
実行結果
a = 5
*p = 5
**pp = 5
ポイント
ポインタのポインタは、ポインタを指すポインタである。
ステップごとの解説
① int a = 5;
- 変数 a を定義し、値 5 を代入する。
- メモリ上に a という名前の領域が確保され、そこに 5 が格納される。
② int *p = &a;
- p は「int型のポインタ」である。
- &a は「変数 a のアドレス(メモリ上の場所)」を意味する。
- よって、p は「a のアドレスを指すポインタ」になる。
③ int **pp = &p;
- pp は「int型ポインタを指すポインタ」、つまり「ポインタのポインタ」である。
- &p は「ポインタ p のアドレス」である。
- よって、pp は「p を指すポインタ」になる。
出力の意味
printf(“a = %d\n”, a); // aの値(5)を表示
printf(“*p = %d\n”, *p); // pが指す先(a)の値(5)を表示
printf(“**pp = %d\n”, **pp); // ppが指すpが指すaの値(5)を表示
すべての出力は 5 になるが、それぞれのアクセス方法が異なる。
表現 | 意味 |
a | 変数 a の値 |
*p | p が指す先、つまり a の値 |
**pp | pp → p → a の値 |
(補足)ポインタのポインタが使われる場面
- 関数内でポインタ自体を変更したいとき(例:動的メモリ確保)
- 多次元配列や文字列配列の操作
- 関数で複数の戻り値を返すような処理
コメント