web-dev-qa-db-fra.com

Initialisation "d'un pointeur sur un tableau d'entiers"

 int (*a)[5];

Comment pouvons-nous initialiser un pointeur sur un tableau de 5 entiers indiqué ci-dessus.

L'expression ci-dessous est-elle correcte?

int (*a)[3]={11,2,3,5,6}; 
15
EnterKEY

Supposons que vous ayez un tableau d'int de longueur 5 Ex.

int x[5];

Ensuite, vous pouvez faire a = &x;

 int x[5] = {1};
 int (*a)[5] = &x;

Pour accéder aux éléments du tableau, vous devez: (*a)[i] (== (*(&x))[i] == (*&x)[i] == x[i]) Parenthèses nécessaires car la priorité de [] L'opérateur est supérieur à *. (une erreur courante peut être de faire *a[i] pour accéder aux éléments du tableau).

Comprenez ce que vous avez demandé en question est une erreur de temps de compilation:

int (*a)[3] = {11, 2, 3, 5, 6}; 

Ce n'est pas correct et une incompatibilité de type aussi, car {11,2,3,5,6} Peut être affecté à int a[5]; Et vous attribuez à int (*a)[3].

Aditionellement,

Vous pouvez faire quelque chose comme pour une dimension:

int *why = (int p[2]) {1,2};

De même, pour deux dimensions, essayez ceci (merci @ caf ):

int (*a)[5] = (int p[][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } };
16
Grijesh Chauhan

{11,2,3,5,6} est un liste d'initialisation, ce n'est pas un tableau, vous ne pouvez donc pas le pointer. Un pointeur de tableau doit pointer sur un tableau qui a un emplacement mémoire valide. Si le tableau est une variable nommée ou juste un morceau de mémoire allouée n'a pas d'importance.

Tout se résume au type de tableau dont vous avez besoin. Il existe différentes façons de déclarer des tableaux en C, selon le but:

// plain array, fixed size, can be allocated in any scope
int array[5] = {11,2,3,5,6};
int (*a)[5] = &array;

// compound literal, fixed size, can be allocated in any scope
int (*b)[5] = &(int[5]){11,2,3,5,6};

// dynamically allocated array, variable size possible
int (*c)[n] = malloc( sizeof(int[n]) );

// variable-length array, variable size
int n = 5;
int vla[n];
memcpy( vla, something, sizeof(int[n]) ); // always initialized in run-time
int (*d)[n] = &vla;
4
Lundin
int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;
1
user1814023
int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;

puis vous accédez au contenu du tableau comme dans:

(*arr)[0] = ...
0
Stefano Falasca