ポインタ
ポインタ
- ポインタ型:変数の型のアドレス版
- ポインタ値:変数のアドレスの数値
- ポインタ変数:アドレスを記憶する変数
ちょこっとメモ
voidポインタ
void*型全変数アドレスに対応できる。
ただし、キャストしないと値を取得できない。
ポインタ宣言
※Nullで初期化:宣言時、自動初期化されないので、いい加減な値がはいっている。
int *p = NULL;
int* p = NULL;
int *p; ←pのみはポインタ変数 int *はポインタ型
int A;
p = &A; ←pにAのアドレスを代入(pの中身はポインタ値)
printf("p = %p\n", p);
printf("&A= %p\n", &A);
※Nullで初期化:宣言時、自動初期化されないので、いい加減な値がはいっている。
int *p = NULL; int* p = NULL;
int *p; ←pのみはポインタ変数 int *はポインタ型 int A; p = &A; ←pにAのアドレスを代入(pの中身はポインタ値) printf("p = %p\n", p); printf("&A= %p\n", &A);
表示イメージ
p = 0x7ffc72d63f5c
&i = 0x7ffc72d63f5c ←pのポインタ値と同一アドレス
&i = 0x7ffc72d63f5c ←pのポインタ値と同一アドレス
ちょこっとメモ
Null
数字の0とはちがうもの。中身がないことを表す。
変身するポインタ
通常の値を表現int *p;
*p;
ポインタ値(アドレス)を表現
int *p;
p;
例)
int *p; int A = 0; p = &A; ←ポインタ値に変数Aのアドレスを代入 *p = 100; ←ポインタ値の変数に100を代入=変数Aに代入 printf("*p = %d\n", *p); printf("p = %p\n", p); printf("A = %d\n", A); printf("&A = %p\n", &A);
表示イメージ
*p = 100 ←ポインタ値が変数A(アドレス)の中身を参照
p = 0x7fff39fe66ec
A = 100
&A = 0x7fff39fe66ec ←pのポインタ値と同一アドレス
p = 0x7fff39fe66ec
A = 100
&A = 0x7fff39fe66ec ←pのポインタ値と同一アドレス
ポインタ演算子
ポインタ変数に加減算を行って配列の要素を使う*(ポインタ変数 + 要素番号)
※先頭の「*」で「ポインタ変数+要素数」(アドレス)を中身(値)に変更する
int *p; int sum = 0, A[5] = {10,20,30,40,50}; p = A; for (int i = 0; i < 5; i++){ sum += *(p + i); } printf("%d\n", sum);
高速版
int *p; int sum = 0, A[5] = {10,20,30,40,50}; for (p = A; p != &A[5]; p++){ sum += *p; } printf("%d\n", sum);
表示イメージ
150
ダプルポインタ
ポインタのポインタint **pp; int *p; int a = 100; pp = &p; p = &a; printf("**pp = %d\n", **pp); printf("*pp = %p\n", *pp); printf("pp = %p\n", pp); printf("*p = %d\n", *p); printf("p = %p\n", p); printf("&p = %p\n", &p); printf("a = %d\n", a); printf("&a = %p\n", &a);
表示イメージ
**pp = 100 ← **pp=*p=変数aの値
*pp = 0x7ffc3253b8dc ←*pp=p=aのアドレス
pp = 0x7ffc3253b8e0 ←pp=pポインタ変数のアドレス
*p = 100 ←*p=変数aの値
p = 0x7ffc3253b8dc ←p=変数aのアドレス
&p = 0x7ffc3253b8e0
a = 100
&a = 0x7ffc3253b8dc
*pp = 0x7ffc3253b8dc ←*pp=p=aのアドレス
pp = 0x7ffc3253b8e0 ←pp=pポインタ変数のアドレス
*p = 100 ←*p=変数aの値
p = 0x7ffc3253b8dc ←p=変数aのアドレス
&p = 0x7ffc3253b8e0
a = 100
&a = 0x7ffc3253b8dc
構造体型 ポインタ変数
構造体型 ポインタ変数での各要素へアクセス- (*構造体ポインタ変数名).要素名
- 構造体ポインタ変数名->要素名
typedef struct member_kata { int team; int number; char name[50]; } member; int main(void){ member data; member *pdata; pdata = &data; (*pdata).number= 10; 又は。 pdata->number= 10; }