Ici vous voulez faire un pointeur sur le premier élément du tableau
uint8_t (*matrix_ptr)[20] = l_matrix;
Avec le typedef, cela semble plus propre
typedef uint8_t array_of_20_uint8_t[20];
array_of_20_uint8_t *matrix_ptr = l_matrix;
Vous pourrez alors profiter à nouveau de la vie :)
matrix_ptr[0][1] = ...;
Méfiez-vous de la monde pointeur/rayon en C, une grande confusion règne à ce sujet.
Modifier
Je passe en revue certaines des autres réponses ici, car les champs de commentaires sont trop courts pour le faire ici. De multiples alternatives ont été proposées, mais on n'a pas montré comment elles se comportent. Voici comment elles se comportent
uint8_t (*matrix_ptr)[][20] = l_matrix;
Si vous corrigez l'erreur et ajoutez l'opérateur address-of &
comme dans l'extrait suivant
uint8_t (*matrix_ptr)[][20] = &l_matrix;
Ensuite, celui-ci crée un pointeur vers un tableau incomplet d'éléments de type tableau de 20 uint8_t. Puisque le pointeur est un tableau de tableaux, vous devez y accéder avec la commande
(*matrix_ptr)[0][1] = ...;
Et parce que c'est un pointeur vers un tableau incomplet, vous ne peut pas faire comme un raccourci
matrix_ptr[0][0][1] = ...;
Parce que l'indexation exige que la taille du type d'élément soit connue (l'indexation implique l'ajout d'un entier au pointeur, elle ne fonctionne donc pas avec les types incomplets). Notez que cela ne fonctionne que dans C
parce que T[]
et T[N]
sont des types compatibles. Le C++ ne possède pas le concept de types compatibles et donc il rejettera ce code, parce que T[]
et T[10]
sont de différents types.
L'alternative suivante ne fonctionne pas du tout, car le type d'élément du tableau, lorsque vous le considérez comme un tableau unidimensionnel, est pas uint8_t
mais uint8_t[20]
uint8_t *matrix_ptr = l_matrix; // fail
Le texte suivant est une bonne alternative
uint8_t (*matrix_ptr)[10][20] = &l_matrix;
Vous y accédez avec
(*matrix_ptr)[0][1] = ...;
matrix_ptr[0][0][1] = ...; // also possible now
Elle présente l'avantage de préserver la taille de la dimension extérieure. Vous pouvez donc appliquer sizeof à cette dimension
sizeof (*matrix_ptr) == sizeof(uint8_t) * 10 * 20
Il existe une autre réponse qui utilise le fait que les éléments d'un tableau sont stockés de manière contiguë.
uint8_t *matrix_ptr = l_matrix[0];
Maintenant, cela ne vous permet formellement que d'accéder aux éléments du premier élément du tableau à deux dimensions. C'est-à-dire que la condition suivante s'applique
matrix_ptr[0] = ...; // valid
matrix_ptr[19] = ...; // valid
matrix_ptr[20] = ...; // undefined behavior
matrix_ptr[10*20-1] = ...; // undefined behavior
Vous remarquerez qu'il fonctionne probablement jusqu'à 10*20-1
Mais si vous ajoutez l'analyse des alias et d'autres optimisations agressives, un compilateur pourrait faire une supposition qui pourrait casser ce code. Ceci étant dit, je n'ai jamais rencontré de compilateur qui échoue avec cette technique (mais encore une fois, je n'ai pas utilisé cette technique dans du code réel), et même la FAQ C contient cette technique (avec un avertissement sur son caractère UB'ness), et si vous ne pouvez pas changer le type de tableau, c'est une dernière option pour vous sauver :)
0 votes
Lire stackoverflow.com/questions/423823/ cela peut vous aider
1 votes
@JohannesSchaub-litb Cela n'existe plus. (Comment puis-je le visualiser à nouveau... ? I connaître Les membres à faible reps peuvent le voir, mais j'ai oublié comment...)
1 votes
@muntoo : Voici une copie de celui-ci : gist.github.com/sharth/ede13c0502d5dd8d45bd