4

私は Primer 5th edition から C++ を学んでおり、ポインタを配列に戻す作業を行っています。この関数の宣言は次のとおりです。

 int (*func(int i))[10]; 

配列へのポインターを返すことが期待されています。

私はこれを行うコードを書きました:

#include <iostream>
#include <string>
using namespace std;

int *func(){
  static int a[]={1,2,3};
  return a;
}
int main (){
  int *p=func();
  for(int i=0;i!=3;++i){
    cout<<*(p+i);
  }
}

そしてそれは働いています。でもここで作ったものとの違いを知りたい

  int (*func(int i))[10]; 

本には具体的な例がないため、この関数呼び出しを機能させる方法。

4

2 に答える 2

3

読む: sizeof(&array) は何を返しますか? array nameと の違いを 理解するaddress of array

Q1次の違いが知りたいです。  

あなたのコードで:

  int *func(){
    static int a[]={1,2,3};
    return a;
  }

最初の要素のアドレスを返しています。の実際の型aint[3]に崩壊しint*ます。重要なのは、
アドレスを に格納しint* p、配列の要素を として評価できることp[i]です。

関数が int のint (*func())[3]場合は、 を返し&a、 に代入しint(*p)[3]、 にアクセスできます(*p)[i]
注: の種類&aint(*)[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()問題ではありません。

静的ではない (動的に割り当てられた) 単純な配列 (または変数) のアドレスを返す場合、クラッシュする可能性のある未定義の動作としてコードに導入されることを検討してください。

于 2013-07-26T13:52:40.107 に答える