C言語について日々勉強中です。極力文書を使わずにコードと図で簡潔にC言語のポインタを整理しました。
勉強中なので誤り等あれば、コメントでご指摘いただけるとありがたいです。
前提
変数は以下の2の要素から構成されます。
- アドレス
- 値
ポインタ変数は「値」に他の変数などのアドレスが格納されています。
ポインタ変数自身もアドレスを持ちます
#変数の各部分
例)整数型へのポインタ変数
ポインタ変数は使用時に*を変数の前につけることで、ポインタ変数の値に格納されているアドレスが指す場所に保存されている値を参照できます。
#サンプルプログラム
#include <stdio.h>
int main() {
int data;
int *ptr1;
int **ptr2;
int ***ptr3;
data = 5;
printf("(A) 整数型の変数dataの値 = %d\n", data);
printf("(B) 整数型の変数dataのアドレス = %p\n", &data);
// 以下はコンパイルエラー
// printf("ptr1が指す場所に保存されている値 = %d\n", *data);
ptr1 = &data;
printf("(C) 整数型の変数dataへのポインタ変数ptr1の値 = %p\n", ptr1);
printf("(D) 整数型の変数dataへのポインタ変数ptr1のアドレス = %p\n", &ptr1);
printf("(E) *ptr1が指す場所に保存されている値 = %d\n", *ptr1);
ptr2 = &ptr1;
printf("(F) ポインタ変数ptr1へのポインタ変数ptr2の値 = %p\n", ptr2);
printf("(G) ポインタ変数ptr1へのポインタ変数ptr2のアドレス = %p\n", &ptr2);
printf("(H) *ptr2が指す場所に保存されている値 = %p\n", *ptr2);
printf("(I) **ptr2が指す場所に保存されている値 = %d\n", **ptr2);
ptr3 = &ptr2;
printf("(J) ポインタ変数ptr2へのポインタ変数ptr3の値 = %p\n", ptr3);
printf("(K) ポインタ変数ptr2へのポインタ変数ptr3のアドレス = %p\n", &ptr3);
printf("(L) *ptr3が指す場所に保存されている値 = %p\n", *ptr3);
printf("(M) **ptr3が指す場所に保存されている値 = %p\n", **ptr3);
printf("(N) ***ptr3が指す場所に保存されている値 = %d\n", ***ptr3);
}
ポインタを関数の引数にした場合や配列についてはまた次の機会に…