【C言語】ポインタ(14)規格書での記載② ポインタ型とは
どうも。gochaです。
今回も、まずはC言語の規格書に記載されているポインタについてから。
- ポインタ型は、被参照型と呼ばれるファンクション型、オブジェクト型、またはインコンプリート型 から派生され得る。
ポインタ型はオブジェクトの特徴を説明し、このオブジェクトの値は、被参照型の実体への参照となる。
被参照型Tから派生されるポインタ型は、時々、“Tへのポインタ”と呼ばれる。
被参照型からポインタ型を構築することは、“ポインタ型の派生”と呼ばれる。
“ポインタ型の派生”は再帰的に適用することができる。
参照(英語):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf#page=48
2つ目の「ポインタ型はオブジェクトの特徴を説明し、このオブジェクトの値は、被参照型の実体への参照となる。」について説明します。
コードを見るのが早いので、見てみましょう。
“int 型へのポインタの型”となるポインタ型と、“char 型へのポインタの型”となるポインタ型にアドレスをアサインし、インクリメントし、表示するプログラム。pointer-type.c
#include <stdio.h>
int main (void){
char a;
int b;
char * pa;
int * pb;
a = 10;
b = 10;
pa = &a;
pb = &b;
printf(" The value of a = %d\n", a);
printf(" The value of b = %d\n", b);
printf(" The contents of pa , char *, = %p\n", pa);
printf(" The contents of pb , int *, = %p\n", pb);
pa++;
pb++;
printf(" The contents of pa++, char *, = %p\n", pa);
printf(" The contents of pb++, int *, = %p\n", pb);
return 0;
}
pointer-type.c のコンパイル、および実行結果
$ gcc pointer-type.c
$ ./a.out
The value of a = 10
The value of b = 10
The contents of pa , char *, = 0x7ffc96f7893b
The contents of pb , int *, = 0x7ffc96f7893c
The contents of pa++, char *, = 0x7ffc96f7893c
The contents of pb++, int *, = 0x7ffc96f78940
「ポインタ型はオブジェクトの特徴を説明し」の部分を説明します。
実行、結果の下4行を見てください。これらの行は“char 型を指すポインタ pa” 、“in t型を指すポインタ pb”それぞれを1つインクリメントすると、それぞれの中身がどのように変化するかを調べています。
結論から言うと、pa は 1、pb は 4、増えています。このことからもポインタ型がオブジェクトの何らかの特徴を説明することが分かると思います。
「このオブジェクトの値は、被参照型の実体への参照となる。」について説明します。なぜ、pa が 1、pb が 4、増えるのかがこの後半の行に関係します。
このオブジェクトの値、は上記、“pointer-type.c のコンパイル、および実行結果”の行5、行6で示されている中身になります。
被参照型というのは、pa, pb によって参照されている型という意味で、具体的には char a の char 型、int b の int 型のことで、実体が a および b になります。
詳細は必要に応じて後程説明しますが、pa が 1 増えるのは、sizeof(a) が 1 であること、pb が 1 増えるの はsizeof(b) が 4 であることに関係してます。
つまり、被参照型のサイズによって、pa、pb を 1 増やしたときの pa の中身、pb の中身の“増え方”が異なっており、被参照型の影響を受けていることが分かるのではと思います。
では次に、pa、pb の中身を使って、被参照型の実体の値を表示してみましょう。
pa、pb の中身を使って、被参照型の実体の値を表示するプログラム pointer-type3.c
#include <stdio.h>
int main (void){
char a;
int b;
char * pa;
int * pb;
a = 10;
b = 10;
pa = &a;
pb = &b;
printf(" The value of a = %d\n", a);
printf(" The value of b = %d\n", b);
printf(" The sizeof a is = %ld\n", sizeof(a));
printf(" The sizeof b is = %ld\n", sizeof(b));
printf(" The contents of pa is = %p\n", pa);
printf(" The contents of pb is = %p\n", pb);
printf(" The value of a by referring contents of pa , char *, = %d\n", *pa);
printf(" The value of a by referring contents of pb , in *, = %d\n", *pb);
pa++;
pb++;
printf(" The contents of pa++ is = %p\n", pa);
printf(" The contents of pb++ is = %p\n", pb);
return 0;
}
type3.c の実行結果
$ gcc pointer-type3.c
$ ./a.out
The value of a = 10
The value of b = 10
The sizeof a is = 1
The sizeof b is = 4
The contents of pa is = 0x7ffd053c520b
The contents of pb is = 0x7ffd053c520c
The value of a by referring contents of pa , char *, = 10
The value of a by referring contents of pb , in *, = 10
The contents of pa++ is = 0x7ffd053c520c
The contents of pb++ is = 0x7ffd053c5210
実行結果は、下記の関係になっています。
行3 a の値、10 を表示
行9 pa の中身を参照させて a の値、10 を表示
行4 b の値、10を表示
行10 pb の中身を参照させて b の値、10 を表示
今回はここまで。
!!! All copyrights belong to the writer of this contents.