ポインタ
Completion requirements
変数のアドレス
ポインタは変数のアドレスです.
Aが通常の変数の場合,&Aは変数Aのアドレスを示します.
Bがポインタの場合,*B はポインタBが指す変数の内容を表します.
つまり, *(&A) == A です.
#include <stdio.h> main() { int a; int* p; p = &a; a = 10; printf("a = %d, p = %08x, *p = %d\n", a, p, *p); }
整数へのポインタは,一般には int *p 等と書きますが,私は int* p と書きます.int* を intへのポインタ型と考えると分り易いからです.
ただし,この場合 int* a, b, c とは書けないので注意が必要です.
配列
#include <stdio.h> main() { int a[10], i; int* p; int* q; q = p = a; for (i=0; i<10; i++) { a[i] = i; printf("a[%d] = %d, p+i = %08x, *(p+i) = %d, *q = %d\n", i, a[i], p+i, *(p+i), *q); q++; } }
配列の名前は,その配列の先頭のアドレスに変換されます.従って,int a[X] の場合 a[i] == *(a+i) です.
これが,配列の添え字が 0から始まる理由です.
前リストで for (i=0; i<10; i++) の 10 を 100 にしてみよう.どんなエラーがどこで表示されますか?
間違った使い方
#include <stdio.h> main() { int* a; *a = 100; printf("*a = %d\n", *a); }
これはどこが間違っているのでしょう?
Last modified: Friday, 6 July 2018, 9:11 AM