2017-07-17 8 views
5

Cでのこれらの2つの違いは何ですか?最初のものはポインタの配列です。 私の主な混乱は、2番目の宣言についてです。それは何を宣言しますか? 2人は同じじゃない?Cではint(* ar)[]宣言は何を意味しますか?

int *p []={&i,&j,&k}; 

int (*ar) []; 
+0

はそれをアウトSorry.Edited。ありがとうございました。 – Neer

+2

["intの配列としてのpの宣言]"(https://cdecl.org/?q=int+*p+%5B%5D)、["intの配列へのポインタとしての宣言]"(https: /cdecl.org/?q=int+%28*ar%29+%5B%5D) – kay

+0

同様の質問で[この回答](https://stackoverflow.com/a/30345939/4265352)を見てください。 – axiac

答えて

4

2つは同じではありません。第2の配列は、intの配列へのポインタであるです。

2D配列をパラメータとして渡すときに、このような宣言を関数パラメータとして使用できます。たとえば、この機能を持た:

void f(int (*ar)[5]) // array size required here to do pointer arithmetic for 2D array 
{ 
    ... 
} 

あなたはこのようにそれを呼び出すことができます。

int a[5][5]; 
f(a); 

別の例ローカルパラメータとして:

int a[5] = { 1,2,3,4,5 }; 
int (*ar)[]; // array size not required here since we point to a 1D array 
int i; 

ar = &a; 
for (i=0;i<5;i++) { 
    printf("a[%d]=%d\n", i, (*ar)[i]); 
} 

出力:

a[0]=1 
a[1]=2 
a[2]=3 
a[3]=4 
a[4]=5 
+0

ありがとう、彼らは宣言され、関数内で使用することができます(パラメータではない)?そうでなければ、関数内にそのようなものを宣言するスコープがなぜあるのでしょうか? – Neer

+0

@Neerはい可能です。私の編集例を見てください。 – dbush

6

ちょうどに従ってください

int *p []={&i,&j,&k}; //読み://

int (*ar) [];を "pはintへのポインタの配列である" "ARは、int型の配列へのポインタである"

関連する問題