基本構造体(Basic Structures) の一番下にあるCvArr型はvoid型のことだ。
void型ってなんでしょう?
void型は「何もない」ですが、void *とポインタにすると32ビットのサイズの変数領域が用意され、しかも指している先のサイズが
わからないとなる。
比較、
int * i;
と書けば、iはポインタ変数で、指している先のサイズは
4バイトとなる。
char * c;
と書けば、cはポインタ変数で、指している先のサイズは
1バイトとなる。
このようにポインタ変数の型の指定は、
指している先の型を意味する。ポインタ変数自体の型のサイズとは関係ないのだ。
つまり、ポインタ変数自体は4バイト!!!。これは何を指していようが32ビットOSなら32ビットサイズ、つまり、4バイトの
アドレスを入れるサイズ。
指している先のサイズがわからないと便利
以下のようなコードはコンパイルできる。
void aa(void *a,void *b){ }
int i;
int main(){
char c;
void *v;
aa(v,&c);
v=&i;
v=&c;
return 0;
}
OpenCVでも関数の引数の型にCvArr*を使っているものがある。
例えば、
cvSub
IplImage構造体を渡すことができる。
void cvSub( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL );
CvArrはvoidとなる。つまり、以下だ。
void cvSub( const
void* src1, const
void* src2,
void* dst, const
void* mask=NULL );
基本的にできるできないを問題にしなければvoid*の引数ならどんな型で渡せる(コンパイルは許可する。実行可能かどうかは別)
(これがあると間違う人が多いからJavaは何を指しているかわからない変数がつかえない仕様にした。だからJavaではコンパイル時に問題が発覚しやすい=人は想像力を常に持つ必要がなくなる。C++でも参照型の仕様が追加されたが使うか使わないかかは好き好き。)
Cの予約語1989 年
そもそも
C言語には以下の言葉が予約されているだけ。言語で言えば、これだけ覚えれば英語がしゃべれるという超楽な言語だ。
printf関数などはライブラリの関数でCの言葉(予約語)ではない。
さて、以下の型しかないはずなのに今はいろいろな型があるように見える。これはtypedefの仕業。
auto break case
char const continue default do
double else enum extern
float for goto if
int long register return
short signed sizeof static
struct switch typedef union unsigned void volatile while
型は
アンダーバーをつけた。
C++にあってCにはない予約語1998 年
1989 年のC からだと30 個追加されています。
asm bool catch class const_cast
delete dynamic_cast explicit export false
friend inline mutable namespace new
operator private protected public reinterpret_cast
template this throw true try
typeid typename using virtual wchar_t
「今日の訪問数: - 」
「昨日の訪問数: - 」
「今までの訪問数: - 」
最終更新:2010年02月17日 09:00