Warning: incompatible pointer
StudiioZ
Messages postés
2
Statut
Membre
-
Dalfab Messages postés 638 Date d'inscription Statut Membre Dernière intervention -
Dalfab Messages postés 638 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Ca fait maintenant deux jours que j'ai commencé à suivre des tutos pour apprendre à programmer en C.
J'ai passé pas mal de temps à essayer de bien saisir le concept de pointeur car j'ai vite compris que c'est un outil indispensable à maitriser pour pouvoir se lancer dans le language C. Dans la théorie je visualise assez bien ce qu'ils représentent et comment on les utilise mais dans la pratique j'ai quelques soucis.
Voici un exemple de code tout bête qui me renvoie un warning lors de la compilation, quelqu'un pourrait il m'aider à comprendre ce qu'il signifie et ce que je fais de mal ?

le warning est le suivant : "main.c:15:13: warning: assignment to ‘char *’ from incompatible pointer type ‘char (*)[3]’ [-Wincompatible-pointer-types]"
Merci d'avance !
Ca fait maintenant deux jours que j'ai commencé à suivre des tutos pour apprendre à programmer en C.
J'ai passé pas mal de temps à essayer de bien saisir le concept de pointeur car j'ai vite compris que c'est un outil indispensable à maitriser pour pouvoir se lancer dans le language C. Dans la théorie je visualise assez bien ce qu'ils représentent et comment on les utilise mais dans la pratique j'ai quelques soucis.
Voici un exemple de code tout bête qui me renvoie un warning lors de la compilation, quelqu'un pourrait il m'aider à comprendre ce qu'il signifie et ce que je fais de mal ?
le warning est le suivant : "main.c:15:13: warning: assignment to ‘char *’ from incompatible pointer type ‘char (*)[3]’ [-Wincompatible-pointer-types]"
Merci d'avance !
Configuration: Windows / Firefox 96.0
3 réponses
-
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI
Merci d'y penser dans tes prochains messages.
-
Bonjour,
Le motarr
désigne le tableau, mais il représente aussi l'adresse du premier élément de ton tableau. Donc prendre l'adresse dearr
, c'est obtenir l'adresse du tableau. Toi tu veux un pointeur sur le 1erchar
du tableau. C'est pour cela que tu verras souvent l'expression : il ne faut pas mettre l'opérateur d'adresse devant un tableau.
Il faut écrire:arr_ptr = arr; // prendre l'adresse du premier élément
// ou
arr_ptr = &arr[0]; // prendre l'adresse du premier élément-
Merci pour votre réponse si rapide !
En réalité, mon objectif derrière ce code est simplement de print l'adresse du tableau. Chose que je pensais faire avec le code ci dessus. En lisant votre réponse je comprends donc que " char *arr_ptr; " pointe vers le premier caractère de mon tableau de caractère, est ce cela ? Si oui, pourquoi mon code ne fonctionne-t-il quand même pas ? J'ai beaucoup de mal à saisir comment fonctionne un tableau en mémoire...
-
-
Tu dis que ton code ne fonctionne pas. Qu'entends tu par là? Ton code doit afficher un nombre "bizarre" qui correspond à l'adresse des données de ton tableau.
C'est toi qui affecte quelque chose àarr_ptr
, c'est toi qui a choisi de lui faire mémoriser l'adresse du 1er élément de ton tableau.
Un tableau c'est une suite consécutive d'éléments dans la mémoire. Par exemple ici, ton tableau contient 3char
, donc 3 octets successifs. Le premier contient le code ASCII de la lettre 'A', le second celui de la lettre 'B'...
Si tu écris:printf("%p ", &arr[0] ); // ou printf("%p ", arr_ptr ); puisque arr_ptr == &arr[0]Ça va afficher 3 nombres (en hexa) qui correspondent aux adresses respectives de ces 3 octets, et chaque nombre ici sera égal au précédent + 1, puisqu'il est juste après.
printf("%p ", &arr[1] ); // ou printf("%p ", arr_ptr+1 ); puisque arr_ptr+1, c'est l'adresse de l'élément après celui désigné par arr_ptr
printf("%p\n", &arr[2] ); // ou printf("%p ", arr_ptr+2 );
Si tu écris:printf("%c ", arr[0] );Ça va afficher A B C.
printf("%c ", arr[1] );
printf("%c\n", arr[2] );