ページ 11

char ** じゃないんですか?

Posted: 2010年8月21日(土) 16:53
by tieria
すいません、初心者的な質問ですが、
char buf[2][32]; の buf は char ** ですか?
というよりも、私の理解として、char ** なんですが、?
ポインタのページを引っ張り出して読むんですが、わかりません。

この buf を引数として渡したいのですが、警告がでます。
ちなみに、char, char *, char **, char ***, char **** にしても
間接参照のレベルが異なっているといわれます。
buf は 何ですか?

int func(char ** buf);
int main(void)
{
char buf[2][32];
func(buf);
return 0;
}
int func(char ** buf)
{
if(buf ==NULL)
{
return 0;
}
return 1;
}

Re:char ** じゃないんですか?

Posted: 2010年8月21日(土) 17:14
by MNS
違います。
bufの型は char (*)[32] です。
ですから、
×int func(char ** buf)
◯int func(char (*buf)[32])
となります。

Re:char ** じゃないんですか?

Posted: 2010年8月21日(土) 17:48
by tieria
MNSさん、ありがとうございます。
mallocで確保するとき char** だったので、**だとばかり思ってました。今の今まで。
お恥ずかしい・・・
いまだよく飲み込めてませんが・・・一つのtypedefのようなもの?ですかね・・・

Re:char ** じゃないんですか?

Posted: 2010年8月21日(土) 18:19
by tieria
解決

Re:char ** じゃないんですか?

Posted: 2010年8月21日(土) 18:31
by MNS
一応、補足程度に。
私も良くは理解していないのですが、
int bufA[2][2];
と、
int a[2];
int b[2];
int* bufB[2] = {a, b};
前者は言わずもがな、二次元配列と呼ばれるもので、いわば「配列の配列」です。
後者は異なり、「配列へのポインタ配列」です。
どちらも呼び出し方に違いはありませんが、
両者は明確に区別されるようです。

この場合、
int** x = bufB;
という構文は間違いではありません。
それは、bufB[0]が指すのは「配列aの先頭のアドレス」だからです。

それに対し、bufA[0]が指すのは、あくまで「配列へのポインタ」です。
ですから、int**x = bufA; という構文は誤りなのです。