2012-03-26 8 views
1

A [N * i + j]を使用して1次元配列として実装されたNxN 2D配列を持っています。私は、配列の列への参照を作成し、それらを通常の列ベクトルとして関数に渡すことができるようにします。以下のN = 3の例を見ることができます。この関数は、渡されたベクトルのちょうど乗を返します。2D配列のカラムへのポインタ

#include <stdio.h> 

int func(int* vec[3]){ 
    int result=0; 
    for(int i=0;i<3;i++){ 
     result+=(*vec[i])*(*vec[i]); 
     printf("vec[%d]=%d\n",i,*vec[i]); 
    } 
    return result; 
} 

void main(){ 
    int A[]={0,1,2,3,4,5,6,7,8}; 

    int *a[3][3]; 

    for(int i=0;i<3;i++){ 
     for(int j=0;j<3;j++){ 
      a[j][i]=&A[3*i+j]; 
     } 
    } 
    for(int i=0;i<3;i++){ 
     printf("vector %d\n",i); 
     for(int j=0;j<3;j++){ 
      printf("%d\n",*a[i][j]); 
     } 
    } 

    printf("%d\n",func(a[0])); 
} 

これは動作しますが、問題は機能のみのタイプint* vec[3]の引数のために働くです。私が本当に好きなのは、関数が型int vec[3]の引数を取るようにすることですが、ポインタのベクトルをベクトル要素が指す値のベクトルとしてどのように渡すべきか混乱します。

答えて

0

に、あなたが引数として配列を渡すことができない、または機能からそれらを返さない、あなたがやりたいことはできません。あなたは現在行っているようなポインタだけを渡すことができます。 vectorは、C++のSTLクラスです。これは、arrayと互換性があり混乱しています。 実際の 2D配列で列の最初の要素を参照できるポインタを渡すことはできますが、ni + j配列にはポインタを渡すことはできません。

0

Cは要素にアクセスするための行です。行のアドレスを渡すことはできますが、列の値を取得するには、行列全体を渡して、行と列のインデックスを使用して行列にアクセスする必要があります行列のアドレスを渡すだけで正しい要素を得るために計算を自分で行うことができます(要素の位置を決定するために計算のために列数と行数を渡さなければなりません)。