Warning: incompatible pointer

Fermé
StudiioZ Messages postés 2 Date d'inscription mardi 15 février 2022 Statut Membre Dernière intervention 15 février 2022 - Modifié le 15 févr. 2022 à 02:21
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 15 févr. 2022 à 16:12
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 !

Configuration: Windows / Firefox 96.0

3 réponses

NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 345
15 févr. 2022 à 09:47
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
15 févr. 2022 à 11:00
Bonjour,

Le mot
arr
désigne le tableau, mais il représente aussi l'adresse du premier élément de ton tableau. Donc prendre l'adresse de
arr
, c'est obtenir l'adresse du tableau. Toi tu veux un pointeur sur le 1er
char
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
0
StudiioZ Messages postés 2 Date d'inscription mardi 15 février 2022 Statut Membre Dernière intervention 15 février 2022
15 févr. 2022 à 12:58
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...
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
15 févr. 2022 à 16:12
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 3
char
, 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]
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 );
Ç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.

Si tu écris:
    printf("%c ", arr[0] ); 
printf("%c ", arr[1] );
printf("%c\n", arr[2] );
Ça va afficher A B C.
0