2011-09-11 12 views
1

以下のプログラムでは、初期化でエラー(*a)[5]=((*)[])&v;が返されます。 私はその行に入力しないと、まだエラーが発生しています。cの配列へのポインタ

int main() 
{ 
    int v[10]; 
    int **p; 
    int (*a)[5]; 
    (*a)[5]=((*)[])&v; 
    printf("%d\n",*a); 
    printf("%d\n",sizeof(v)); 
    return 0; 
} 
+5

あなたは何をやっていると思いますか?何をすべきか? –

+0

エラーは何ですか? – tenpn

+6

ああ痛み..... –

答えて

4

エラーが発生した場合は、実行時エラーが発生している可能性があります。 int(* a)[5]は、初期化されない5つのintの配列へのポインタです。しかし、次の行では逆参照しようとします。あなたはそれを使用する前に 'a'を初期化する必要があります。それをvで初期化しようとしているかもしれませんが、それは5の整数の配列ではありません。 vをint v [5]として再宣言する場合、a = & vが動作するはずです。

+0

'(int(*)[5])&v 'を使うと、おそらく最も良いスタイルではありませんが、' v '。 –

5

&vは、int配列vへの参照であるため、タイプはint **(本質的に)です。 int (*a)[5]は、5つの整数の配列へのポインタを宣言していることを意味します。しかし、次の行では、(*a)[5]と書くと、aを逆参照してintポインタを取得し、再度dereferncingして[5]に格納された要素にアクセスすることを意味します。 Cの配列はゼロインデックスされているので、[0][4]にしかアクセスできず、[5]は割り当てられません。

あなたはa = &vが必要です。これにより、aがintポインタvへのポインタになります。 *aはそう"%d"が飛ばないだろうint型のポインタがあるように他の問題がありますが、あなたはなど

+0

誰にでも-1'dに、理由についてコメントしていただけますか?私は間違ったことを書いたとは思わない。 – BlackJack

+1

:説明してくれてありがとうございます。しかし、&vはint配列へのポインタであり、intへのポインタへのポインタではありません。試してみるとp =&v;コンパイラは 'int(*)[10]'から 'int **'に変換できないというエラーをスローします。 – Angus

+0

私は-1はしませんでしたが、あなたの答えはいくつかの点では配列がポインタであると言われていますが、これはかなり間違っています。 'int型'ではなく 'int型(*)[10]'型であり、 'int型'(int)型の変数からの代入に驚いています。 (*)[5] 'はキャストなしで動作します。 –

4

変数aへの代入だけでaを持っている必要があり、((*)[])はちょうど不要で、aまたはvに任意の値が与えられていませんLHS。

2

私は[5] int型*ポインタの配列である*あなたが

#include <stdio.h> 

int main() 
{ 
    int v[10]; 
    int **p; 
    int *a[5]; 

    v[0] = 1234; 
    a[0] = v; 

    printf("%d\n", *a[0]); 
    printf("%d\n", sizeof(v)); 

    return 0; 
} 

を期待しているよりも簡単だと思います。 v [10]は事実上intへのポインタでもあります。

So *とa [0]は実質的に同じものです。

ETA:おそらくprintf( "%d \ n"、a [0] [0]);より良いです

+0

'a [0]'はガーベジポインタを逆参照しています。 –

+0

私はそうは思わない。 – bobc