- ベストアンサー
複雑なポインタの型定義と使い方
- 複雑なポインタの定義や使い方について御教示願います。
- typedefを使用したi型の変数arrayを使って、変数a~fの内容を表示させたいが、型の不整合が起こってしまいます。
- 具体的なポインタの型定義や使い方について御教示願います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ANo.2さん 訂正ありがとうございます。 回答するとき、配列が文脈によって配列の先頭要素へのポインタ扱いされることを考えていたせいかuの型を間違えて書いてしまい、&uの型も一緒に間違えてしまいましたね。 > uのポインタ配列のアドレス(&u)を取ると、それは配列へのポインタ((*)[2])へのポインタになるということですね? 「int型のポインタの配列(要素数2)であるu」のアドレス(&u)をとると 「int型のポインタの配列(要素数2)へのポインタ」になります。 「int型のポインタの配列(要素数2)」は int *[2] 「int型のポインタの配列(要素数2)へのポインタ」は int *(*)[2] ついでに、 「int型のポインタの配列(要素数2)へのポインタの配列(要素数3)」は int *(*[3])[2] typedef int *(*i[3])[2]; で定義されるiは 「int型のポインタの配列(要素数2)へのポインタの配列(要素数3)」 ですので、i型の変数arrayの各要素には、 「int型のポインタの配列(要素数2)へのポインタ」 を入れなければなりません。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 はちょっと勇み足しちゃったかな? int a = 0; int b = 1; int *u[2] = {&a, &b}; としたとき, u の型は int *[2] だし &u の型は int *(*)[2]. &u は「u という (配列) オブジェクトのアドレス」です. いまさらの確認だけど, 例えば int a[10]; とあったとき a の型は int * 「ではない」というのはいいよね?
補足
なんとなく分かりました。 uのポインタ配列のアドレス(&u)を取ると、それは配列へのポインタ((*)[2])へのポインタになるということですね? *(*array[0])[0] = *(*&u)[0] = *(u)[0] = *u[0] = 0 になるということですよね? 何か補足ありましたらお願いします。
- Gotthold
- ベストアンサー率47% (396/832)
経験はないけどこんな感じ? #include <stdio.h> typedef int *(*i[3])[2]; int main() { int a = 0; int b = 1; int c = 2; int d = 3; int e = 4; int f = 5; int *u[2] = {&a, &b}; int *v[2] = {&c, &d}; int *w[2] = {&e, &f}; int **pp[3] = {u, v, w}; /* arrayをi型(intへのポインタを要素とする2個の配列へのポインタを要素とする3個の配列)として宣言 */ i array = {&u, &v, &w}; /* この部分でarrayを使って変数a~fの内容を表示したい */ printf("%d\n", *(*array[0])[0]); printf("%d\n", *(*array[0])[1]); printf("%d\n", *(*array[1])[0]); printf("%d\n", *(*array[1])[1]); printf("%d\n", *(*array[2])[0]); printf("%d\n", *(*array[2])[1]); return 0; } uはint *型で、&uはint *[2]型なので、&uはuにはできない。 そもそも、なんでi型はこんな定義なの? 面倒になるだけな気がしますが。
補足
御返答ありがとうございます。 ひとつ分からない所があるので教えてください。 uが(int *)型になるのは分かるのですが、&uが何故(int *[2])型になるのでしょうか? そもそも&uは何を示しているのでしょうか? よろしくお願い致します。
補足
御説明ありがとうございます。 int *(*)[2]は配列の前のポインタに()が付いていたので、配列へのポインタか?と思ってしまいました。そうではなく、これはポインタを実行する順序の()であるという理解でよいのですよね? 詳しい御説明ありがとうございました。