7
votes

Pointeur au premier élément de la matrice! (C)

Je suis nouveau à C.

Je sais que cela a été posé sous de nombreuses formes, mais le mien est un peu unique ... je suppose. J'ai un pointeur abrégé non signé. xxx

Le tableau est déclaré comme tel: const Sans signé courte myarray [1024] et est une gamme de numéros hexagonaux de la forme 0x0000 et ainsi de suite.

J'essaie de compiler, il jette ces erreurs: xxx

Toutes idées de ce qui ne va pas?

merci, Phil


2 commentaires

Notez que des représentations telles que hexadécimales, décimales et octal ne sont entrées en jeu pour les littéraux entier dans le code source. Il n'existe pas de chiffres hexagonaux (ou de nombres décimaux ou de quoi-êtes-vous) en ce qui concerne le programme compilé. Les entiers utilisent le format que la plate-forme fournit (généralement le complément de 2). En tant que tel, myarray est simplement une gamme de courts métrages constants non signés, pas de "numéros hexagonaux".


@outis: Excellente observation sur un concept de programmation important. Je l'ai ajouté à mon inventaire de concept de logiciel.


4 Réponses :


11
votes

Mon hypothèse (vous ne montrez que deux lignes) est que ce code apparaît en dehors d'une fonction. Ceci est une déclaration:

pt = myArray;
pt = &myArray[0]; // same thing


2 commentaires

Ah ... wow oui c'était en dehors d'une fonction! Merci! Je l'ai déplacé au bon endroit et la plupart de mes erreurs sont parties. Alors maintenant, j'ai: 22 Susminé Short * PT; 23 pt = & myarray [0]; dans la principale () de ma fonction. Oui Pour une raison quelconque, je reçois toujours le programme.c: 23: Erreur: l'affectation rejeter les qualificatifs de la cible de pointeur Toute idées à ce sujet? Dois-je montrer plus de lignes?


Si votre tableau a du type const non signé court [1024] , alors votre pointeur doit avoir le type const non signé court * . Le qualificatif étant rejeté est const . Essayez d'utiliser le compilateur clang au lieu de GCC , les messages d'erreur sont plus informatifs.



3
votes

Ouais, vous devriez vraiment inclure un peu plus de code afin que nous puissions voir le contexte.

Je ne reçois pas vraiment les messages d'erreur, mais votre code n'est pas correct.

Essayez: < / p> xxx

ou: xxx

ou juste: xxx

.


4 commentaires

Je suis un peu curieux de savoir quelle est la motivation pour pt = myarray + 0; ?


@Gavinh: La motivation est pédagogique.


@John: Bien sûr, il démontre le pointeur arithmétique, mais il existe des raisons impérieuses d'utiliser l'option 1 ou l'option 3, mais je ne pense pas que ces raisons existent pour l'option 2. Ajout de pt = & 0 [myarray];


@Gavinh Je ne vois pas la réponse comme fournissant trois choix. Je vois le second comme "montrant son travail" pour obtenir du premier au troisième. Je n'ai pas suggéré qu'il y avait une valeur pratique supplémentaire à la seconde en soi.



0
votes

Vous ne devez pas jeter le qualificatif de const; Donc, le pointeur doit avoir un modificateur Const. XXX


3 commentaires

Je pense (mais je me tromperais peut-être) que votre réponse s'appliquerait à C ++ mais non à c (que l'OP utilise).


Nope, je viens de le tester avec le compilateur C ++ de Mingw (G ++). Il compilait sans aucun avertissement et le pointeur a fonctionné pour lire le tableau et (lorsque j'ai supprimé le modificateur Const) pour écrire au tableau.


Oh d'accord. Eh bien, je viens de l'essayer dans GCC (c) aussi et cela fonctionne. J'ai utilisé ce type d'affectation plusieurs fois en C, dans de nombreux compilateurs différents. J'ai mal interprété votre commentaire et supposé que vous étiez sceptique sur le cas C ++.



9
votes

& code> est l'opérateur de référence. Il renvoie l'adresse mémoire de la variable qu'il précède. Les pointeurs stockent adresses de mémoire forts>. Si vous souhaitez "stocker quelque chose dans un pointeur", vous le dérangez avec l'opérateur * code>. Lorsque vous faites que l'ordinateur examinera l'adresse de la mémoire, votre pointeur contient, ce qui convient à la conservation de votre valeur.

char *pc; // pointer to a type char, in this context * means pointer declaration
char letter = 'a'; // a variable and its value

pc = &letter; // get address of letter
// you MUST be sure your pointer "pc" is valid

*pc = 'B'; // change the value at address contained in "pc"

printf("%c\n", letter); // surprise, "letter" is no longer 'a' but 'B'


0 commentaires