①型
スポンサーリンク
型とはメモリ領域をどれくらい取るかというのをコンパイラに教えるためのものである。
型を知る上で非常に重要な機能はsizeofという命令。sizeofで得られた結果はsize_t型になる。
#include<stdio.h> int main(){ printf("char =%u\n",sizeof(char)); printf("short =%u\n",sizeof(short)); printf("int =%u\n",sizeof(int)); printf("float =%u\n",sizeof(float)); printf("long =%u\n",sizeof(long)); printf("double=%u\n",sizeof(double)); printf("u_char =%u\n",sizeof(unsigned char)); printf("u_short =%u\n",sizeof(unsigned short)); printf("u_int =%u\n",sizeof(unsigned int)); } 実行結果 char =1 short =2 int =4 float =4 long =4 double=8 u_char =1 u_short =2 u_int =4
上記のようにcharは1バイト
short は2バイト
int float long は4バイト
double は8バイトである。
因みにsize_t型は多くの処理系でunsigned int型になる。
従ってprintf関数の中で%uと表記される。
ここでポインタに変えてみると・・・
#include<stdio.h> int main(){ printf("char =%u\n",sizeof(char*)); printf("short =%u\n",sizeof(short*)); printf("int =%u\n",sizeof(int*)); printf("float =%u\n",sizeof(float*)); printf("long =%u\n",sizeof(long*)); printf("double=%u\n",sizeof(double*)); printf("u_char =%u\n",sizeof(unsigned char*)); printf("u_short =%u\n",sizeof(unsigned short*)); printf("u_int =%u\n",sizeof(unsigned int*)); } 実行結果 char =4 short =4 int =4 float =4 long =4 double=4 u_char =4 u_short =4 u_int =4
なんとすべて4バイトになった。
ポインタは簡単に言うとアドレスなので4バイト=32ビット、
つまり2の32乗分のアドレスが読めるようになっている。
すべて同じなのに何故型が必要かというとポインタを演算すれば分かる。
#include<stdio.h> main(){ int i; int* a=0; short *b=0; char* c=0; for(i=0;i<5;i++) printf("a=%d\tb=%d\tc=%d\n",a++,b++,c++); } 実行結果 a=0 b=0 c=0 a=4 b=2 c=1 a=8 b=4 c=2 a=12 b=6 c=3 a=16 b=8 c=4
このようにインクリメントされるごとに進む値が違う。
値は型の大きさ分だけ進む。言い換えればsizeofで得られる数値を単位とする。
配列などの複合で使ったりする。
因みにint *a;もint* a;も同じである。
さて、型は省略するとint型になる。
voidでは無い。
だからこそ
#include<stdio.h> fanc(); fanc2(); main(){ int a,b; a=fanc(); b=fanc2(); printf("a=%d\tb=%d\n",a,b); } fanc(){return 4235;} fanc2(){return -1;}
こんな風に書ける。
voidとはそもそも戻り値を省略したり、凡用的に使いたい時に記述するものである。
従って
#include<stdio.h> main() { void *void_p=0; char *char_p=0; int *int_p=0; void_p=char_p; void_p=int_p; printf("%d\n",void_p); }
このように自由な型をキャスト(型変換)無しに代入することが出来る。
参照文献
C言語 ポインタが理解できない理由 朝井淳