2012-03-31 8 views
-3

2次元配列へのポインタを持つコードを記述しようとしています。2次元配列を指す

私の主な目的は、2次元である5つの配列を指すように、1つの配列だけではなく、

int asd1[2][2]; 
int asd2[2][2]; 
int *se; 
se[0] = asd1; 
se[1] = asd2; 
+1

は、あなたが "パラメータとして2次元配列を渡す" ググことがありますか? –

答えて

0

使用se = asd[0];

理由は、シンボルasdがintではなくintの一次元配列へのポインタへのポインタを得ないということです。

@ Migの解決策も良いかもしれません。それはあなたが望むものに依存します。私の経験では、のような基本型の2次元配列をのように扱うと、1次元の長さがn * nのようになります。(これは数値計算では真実ですが、BLASとLAPACKを呼び出す可能性がありますが、他の場所でも真実かもしれませんが、ここで数値的な仕事はしていませんが、 。あなたが好むしない幸運を参照してください)

0

を使用すると、動的にその配列を割り当てた場合、あなたはこのような何かを行うことができ:

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 10 

int main() { 
    int i; 
    int **asd; 
    asd = (int **)malloc(sizeof(int *) * SIZE); 
    for (i = 0; i < SIZE; i++) { 
    asd[i] = (int*)malloc(sizeof(int) * SIZE); 
    } 

    int **se; 
    se = asd; 
    se[0][1] = 10; 
    printf("%d %d\n", se[0][1], asd[0][1]); 

    for (i = 0; i < SIZE; i++) { 
    free(asd[i]); 
    } 
    free(asd); 

    return 0; 
} 

EDIT:私の最初の答えが間違っていた、ここです私が言ったこと:

あなたの配列は2次元であるため、ポインタへのポインタが必要ですNAL:

int asd[2][2]; 
int **se; 
se = asd; 

今、あなたのことができるようにする必要があります

se[0][1] = 10; 
+0

いいえ、それは動作しません。 '[int *、int *、...]'ポインタは 'sub'へのポインタであり、 's [n] [int] '-arrays – x539

+0

あなたは私の問題だったse = asdと同等ではありません – berkay

+0

@ x539あなたはありがとう!私は私の答えを編集します。 – Mig

0

あなたはこのような何かをしたい:

int asd[2][2]; 
int (*se)[2] = asd; 

これは

int (*se)[2] = &asd[0]; 

asdので減衰に相当しますへのポインタにこの文脈の最初の要素。

心に留めて重要なことは、あなたがint[2](すなわちint (*)[2])とないint*(すなわちint**)へのポインタへのポインタを必要とするので、asd[0]のタイプは、int[2]、ないint*であるということです。

場合のようなお、あなたがasd[0]の最初の要素にint*点を作ることができる。

int *p = &asd[0][0]; // or just = asd[0];, because it decays to &asd[0][0]; 

それは、例えば、1次元配列であるかのように、2Dアレイの他の要素にアクセスしますp[2]は、未定義の動作になります。


より一般的な点として、生のCスタイルのアレイを手助けすることができればそれを避けるほうがよい場合がよくあります。必要に応じて、std::arrayまたはstd::vectorを調べることをおすすめします。

0

あなたはこれを行うことができます。

#include<stdio.h> 
int main() 
{ 
    int asd[2][2] = {{0,1},{2,3}}; 
    int (*se)[2]; // a pointer (*se) to an array (2-element array, but only you know it, not the compiler) of array-of-two-integers [2] 
    se = asd; 

    printf("%d %d\n%d %d\n", se[0][0], se[0][1], se[1][0], se[1][1]); 

    return 0; 
} 

か:

#include<stdio.h> 
int main() 
{ 
    int asd[2][2] = {{0,1},{2,3}}; 
    int (*se)[2][2]; // a pointer (*se) to a 2-element array (first [2]) of two element array (second [2]) of ints 
    se = &asd; 

    printf("%d %d\n%d %d\n", (*se)[0][0], (*se)[0][1], (*se)[1][0], (*se)[1][1]); 

    return 0; 
}