読む: sizeof(&array) は何を返しますか? array name
と の違いを 理解するaddress of array
。
Q1次の違いが知りたいです。
あなたのコードで:
int *func(){
static int a[]={1,2,3};
return a;
}
最初の要素のアドレスを返しています。の実際の型a
はint[3]
に崩壊しint*
ます。重要なのは、
アドレスを に格納しint* p
、配列の要素を として評価できることp[i]
です。
関数が int のint (*func())[3]
場合は、 を返し&a
、 に代入しint(*p)[3]
、 にアクセスできます(*p)[i]
。
注: の種類&a
はint(*)[3]
.
Q2この関数呼び出しを機能させるにはどうすればよいですか。本には具体的な例がありません。
お気に入り:
int (*func())[3]{
static int a[]={1,2,3};
return &a;
}
そして main():
int main(){
int i=0;
int(*p)[3] = func();
for(i=0; i<3; i++)
printf(" %d\n", (*p)[i]);
return 0;
}
2 番目のバージョンのコード作業 ID Ideoneを確認できます
Q1次の違いが知りたいです。
2 つの違いを知りたいのでp
、2 つのバージョンのコードで の 2 つの異なる宣言を比較します。
1) : に等しいint* p;
配列要素にアクセスします。 p[i]
*(p + i)
2) : そして、等しいか単に =であるため、int (*p)[i]
配列要素にアクセスします。(演算子の優先順位が配列要素に対する防御を意味する よりも高いため、配列要素にアクセスするために追加しました)。(*p)[i]
*((*p) + i)
*(*p + i)
()
*p
[]
*
*p[i]
編集:
戻り型以外の追加情報:
どちらの種類の関数でも、静的変数 (配列) のアドレスを返します。静的オブジェクトの寿命は、プログラムが終了するまでです。したがって、配列のアウトサイズへのアクセスはfunc()
問題ではありません。
静的ではない (動的に割り当てられた) 単純な配列 (または変数) のアドレスを返す場合、クラッシュする可能性のある未定義の動作としてコードに導入されることを検討してください。