#include<stdio.h> int main(void) { int *p; int k = 123456; int t; p = &k; t = *p; printf("p=%p, t=%d\n", p, t); return 0; }
$ gcc main.c -o main && ./main
p=0xfffff6a796e8, t=123456
&kはアドレスで、ポインタを代入は値の代入になる
### 割り当てられていない領域をアクセス
int main(void) { int *p; int k = 123456; int t; p = &k; p++; t = *p; printf("p=%p, t=%d\n", p, t); return 0; }
p=0xffffd0f0d40c, t=65535
pのアドレスを一つ進めているので、異なる値が表示される
### 割り当てられている領域をアクセス
int main(void) { int *p; int k[2] = {12345, 67890}; // 配列 int t; p = &k[0]; p++; t = *p; printf("p=%p, t=%d\n", p, t); return 0; }
$ gcc main.c -o main && ./main
p=0xfffff62356e4, t=67890
配列の場合は、ポインタを一つ進めると、配列の次の値となる。
int main(void) { int *p; int k[2] = {12345, 67890}; // 配列 int t; p = k; p++; t = *p; printf("p=%p, t=%d\n", p, t); return 0; }
$ gcc main.c -o main && ./main
p=0xffffecd87384, t=67890
配列kは、kの先頭アドレスを指す
int main(void) { int *p; int k[3] = {111, 222, 333}; // 配列 int t; p = &k[1]; p++; t = *p; printf("p=%p, t=%d\n", p, t); return 0; }
$ gcc main.c -o main && ./main
p=0xffffc27bcfc0, t=333
これは説明不要
int main(void) { int *p; int k[3] = {111, 222, 333}; // 配列 int i; p = k; for(i =0; i < 3; i++){ int value = *p++; printf("value=%d\n", value); } return 0; }
$ gcc main.c -o main && ./main
value=111
value=222
value=333
配列の先頭アドレスから出力している
配列をポインタに代入して、ポインタを進めることで、配列の値を出力するというのは多用できそうですね。