1

重複の可能性:
gccコンパイルエラー:キャストは配列タイプを指定します

(int *)と(int [])の違いを確認したい。次のコードをコンパイルすると、1行目は問題なく動作します。しかし、2行目では、私のコンパイラは次のエラーを出します。

test.c:10: error: cast specifies array type

誰かがこのエラーの意味と私がどこで誤りを犯したのか教えてもらえますか?

#include<stdio.h>

void abc(int *a)
{
        int i;
        for(i=0;i<2;i++)
        {
            printf("%d",((int * )a)[i]);  //(1)
            printf("%d",((int [])a)[i]); //(2)
        }
}

int main()
{
    int b[2]={0,1};
    abc(b);
    return 0;
}
4

3 に答える 3

8

一般int *に、 は (整数への) ポインターでありint[]、サイズが指定されていない配列であり、いわゆる不完全型です。不完全型は宣言でのみ使用でき、定義で完全にする必要があります。例 (次のコードはグローバル スコープにあります)。

extern int[] p; //declaration of p

int p[5]; //definition of p - size must be specified

関数パラメーターについて話すときは、まったく別の話です。宣言:

void f(int *p)

void f(int p[])

同一になります。もしそうなら、それは単なる構文糖です。


編集:それ以外:配列とポインタの違いは何かと尋ねている場合:すべて!より具体的な回答については、 C-faqs.comにリンクします。

于 2012-04-28T10:52:27.040 に答える
1

これを試して

void abc(int *a){ 
  int i; 

  for(i=0;i<2;i++){
     printf("%d",*(a+i));  //(1)
     printf("%d", a[i]);   //(2) 
  } 
} 

ポインターと配列の理解にもっと時間を費やす必要があります。配列の名前は彼の最初の要素へのポインターです。メモリピースとそれへのポインターのように、配列の名前を使用して配列を操作できます。

于 2012-04-28T10:50:03.950 に答える
0

全くない。int * は、メモリ内の整数へのポインタを意味します。[] ブラケットは配列を表します。int[10]; 10 個の整数の配列を作成します。int *a; 整数へのポインタを作成します。

ポインターは、より多くのメモリを消費するため、単純型ではお勧めできません。

詳細な回答については、 http://www.cplusplus.com/doc/tutorial/arrays/およびhttp://www.cplusplus.com/doc/tutorial/pointers/を確認してください。

于 2012-04-28T10:48:45.590 に答える