2012-03-31 4 views
-3

J'essaie d'écrire du code qui a un pointeur vers un tableau à deux dimensions.Pointage vers un tableau à deux dimensions

Mon objectif principal est de ne pas seulement un tableau asd, comme je voudrais pointer 5 tableau dont chacun est en 2 dimensions.

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

Avez-vous googlé "passer tableau 2D comme paramètre"? –

Répondre

0

Utilisez se = asd[0];

La raison en est que le symbole asd donne pas un pointeur vers un int, mais plutôt un pointeur vers une unidimensionnel tableau de ints.

La solution de Mig peut également être bonne. Cela dépend de ce que vous voulez. Dans mon expérience, il a tendance à mieux fonctionner lorsque vous traitez un tableau à deux dimensions d'un type de base comme int comme s'il s'agissait d'un unidimensionnel de longueur n * n. (Ceci est particulièrement vrai dans le travail numérique, où vous êtes susceptible d'appeler BLAS et LAPACK, mais peut-être vrai ailleurs, vous ne faites probablement pas de travail numérique ici, mais, eh bien, essayez @ Mig et les deux, et de voir que vous ne préférez Bonne chance)

0

Si vous allouez ce tableau dynamique, vous pouvez faire quelque chose comme ceci:..

#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: Ma première réponse était fausse, voici ce que j'avais dit:

Vous avez besoin d'un pointeur vers un pointeur, puisque votre tableau est 2-dimensio nal:

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

Maintenant, vous devriez être en mesure de:

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

Non. Ça ne marchera pas. 'asd' est' [[int, int], [int, int]] 'aucun pointeur juste des éléments, et' se [n] [m] 'attend' '[int *, int *, ...]' des pointeurs vers 'sub '-arrays – x539

+0

vous ne pouvez pas assimiler se = asd, c'était mon problème – berkay

+0

@ x539 Vous avez raison, merci! Je vais modifier ma réponse. – Mig

0

Vous voulez quelque chose comme ceci:

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

Cela équivaut à

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

parce asd désintégrations à un pointeur vers son premier élément dans ce contexte.

L'essentiel de garder à l'esprit est que le type de asd[0] est int[2], pas int*, vous avez donc besoin d'un pointeur vers un int[2] (à savoir int (*)[2]) et non un pointeur sur un int* (à savoir int**).

Soit dit en passant, vous pouvez faire un point int* au premier élément du asd[0] si vous aimez:

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

mais accéder aux autres éléments du tableau 2D comme si elle était un tableau 1D, par exemple p[2], serait un comportement indéfini.


Comme point plus général, il est souvent préférable de éviter l'utilisation de tableaux de style C crus tout à fait si vous pouvez l'aider. Vous pourriez vouloir enquêter std::array ou std::vector, selon vos besoins.

0

Vous pouvez le faire:

#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; 
} 

ou:

#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; 
} 
Questions connexes