char et char* (pointeur)
Je voudrais comprendre comment les pointeurs de travail, j'ai donc créé ce petit programme. tout d'abord, je créer un p pointeur qui pointe sur un char.
La première question est à ce point. Si je crée un pointeur, la valeur de celui-ci est un memoryaddress (si j'point à un non-pointeur de l'objet), mais cette fois, c'est "haha" dans mon exemple. Pourquoi faut-il travailler de cette façon dans char*? Et comment je peut ajouter de la valeur avec le cin >> p?
Ma deuxième question est que, j'ai créé un q char, qui a la valeur de l' *p pointeur sur le point que j'ai créé il. MAIS sa valeur et l'adresse de "h" de trop, mais pourquoi? Il doit être l'adresse de la mémoire de ce char objet! Il ne sert à rien 😀 (mingw - gcc)
#include <iostream>
int main()
{
/* char *p;
cin >> p; //forexample: haha */
char * p = "haha";
char q = *p;
std::cout << "&q = " << &q << std::endl; //&q = h
std::cout << "q = " << q << std::endl; //q = h
return 0;
}
PLUS: Si j'alloue de la mémoire de la première avec un char[100]; char *p=a; puis &q = h»ŢĹ, si "h" et quelques dégâts. mais il doit être un memoryaddress! et ma question est, pourquoi n'est-il pas d'adresse alors?
p
n'ont pas de mémoire pour la saisie.OriginalL'auteur Iburidu | 2012-10-13
Vous devez vous connecter pour publier un commentaire.
Pense
char* p;
comme d'adresse dans la mémoire. Vous n'avez pas initialiser le pointeur de sorte qu'il n'a pas à quoi que ce soit, vous ne pouvez pas l'utiliser.Pour être sûr toujours:
soit initialiser le pointeur à zéro:
ou d'initialiser certaines automatique
ou la mémoire globale:
ou obtenir de mémoire dynamique:
Ensuite, vous pouvez utiliser p (si non NULL) pour lire les données et de les lire à partir de p...
Pour votre misunderstaning de
operator >> (std::istream&, char* p)
. Cet opérateur s'attend à ce quep
points à la mémoire (automatique,global,dynamique, peu importe) - il n'a pas allouer de la mémoire en lui-même. Simplement, il lit les caractères à partir du flux d'entrée jusqu'à ce que les espaces et les copier dans la mémoire pointée parp
- maisp
doit déjà les points à la mémoire.Pour prendre l'adresse de
char q;
. Bien sûr, vous pouvez prendre l'adresse deq
:&q
, et il est de typechar* p
. Mais&q
est différent quep
, et ceq=*p
juste des copies premier caractère pointé parp
àq
, il ne peut pas changer l'adresse deq
- son adresse est immuable. Pourcout << &q
-operator << (ostream&, char* p)
s'attend à ce quep
points à NULL string - et&q
points à la mémoire contenant"H"
mais qu'est-ce que après ce caractère, nul ne le sait - de sorte que vous obtiendrez des ordures sur l'écran. Utilisationcout << q
pour imprimer caractère unique.ok, j'ai créé un programme avec des int et int a été alloué, je peux cout << p; et il va écrire l'adresse de retour. le programme est court et simple: "int a[10]; int p = a; cin >> (char *)p; cout << p << "," << atoi((char)p); "
Parce que vous n'avez pas céder à
p
toute valeur, même0
- il une certaine adresse au hasard. Vous avez copié le "haha" à certains de mémoire vive dans votre programme, il pourrait causer quoi que ce soit, c'est un comportement indéfini - il peut même causer de l'envoi d'un e-mail à votre patron que vous avez de meilleur travail, mais il peut aussi arriver que cette mémoire vive n'est pas utilisé - de sorte qu'il semble que votre programme fonctionne correctement.Pour vous dernier exemple:
int a[10];
- disons adresse mémoire dea
est 0x123.int p = a;
- vous lancez l'adresse de int - doncp == 0x123
comme valeur.(char*)p
inverse de la coulée - de sorte que votre programme de pense 0x123 est le début de char tableau. Doncint[10]
est équivalent àchar[10*sizeof(int)]
... Si vous avez de la mémoire, tout est OK.oui, mais dans mon exemple, p est égal à une adresse de mémoire. et j'ai créé votre exemple avec un[100], et p a été "haha", n'était pas égal à une adresse de mémoire, mais il devrait être!
OriginalL'auteur PiotrNycz
Première chose à apprendre et rappelez-vous toujours sur les pointeurs est de vous assurer d'allouer de la mémoire pour eux, sinon votre programme ne fonctionnera pas correctement.
Votre code devrait en fait être modifié comme suit pour allouer de la mémoire, de sorte que "cin" peut écrire la saisie de l'utilisateur dans la mémoire allouée:
Maintenant, un personnage pointeur est une variable qui pointe vers une position en mémoire contenant un ensemble de caractères (pas nécessairement un caractère, peut-être plus d'un, peut-être rien comme dans le cas de la valeur spéciale null), alors qu'une variable de caractère est en fait la tenue d'un seul caractère (pas un ensemble de caractères).
Les opérateurs de base lorsque vous traitez avec des pointeurs est le &(adresse) et *(valeur). Le & récupère l'adresse d'une variable, donc si nous avons [char q;] [&q] serait un pointeur de caractère. D'autre part, l' * récupère la valeur au pointeur, donc si nous avons [char *p;] puis sur [*] serait le personnage dans la mémoire à laquelle p est le pointant du doigt.
Maintenant revenir à votre exemple, des commentaires en ligne pour une illustration
J'espère que cela aide
le cas particulier qui se passe sur votre machine/compilateur n'est pas le cas général. Le résultat du stockage de données dans les non-alloué de l'espace mémoire est imprévisible. Dans votre cas, la mémoire est déjà pleine de zéros, de sorte que l'impression de la chaîne de départ &q imprimé "h" bien juste par pur hasard, rien de plus.
ok, je alloués par l'ajout d'un char[100]; int* p=a; MAIS pourquoi p == "haha", si elle doit être une adresse de mémoire (&a[0])?
les tableaux en C++ sont mis en œuvre comme des pointeurs, donc la plupart du temps, vous pouvez utiliser les tableaux et les pointeurs de façon interchangeable. Par exemple: int *p = new int[100]; ensuite, vous pouvez faire p[0]=1; p[1]=50; ... etc.
De retour à votre exemple: le cout sera imprimée, la chaîne "haha" parce qu'il remarquerez que vous essayez d'imprimer un char* ... si vous souhaitez imprimer l'adresse, vous pouvez la lancer à
(void *)
ou utilisez l'instructionprintf("%p", p);
OriginalL'auteur Hisham
Vous devriez avoir quelque chose comme:
en haut de votre programme. Ou peut omettre le
using
et reportez-vous àstd::cin
etstd::cout
.p
est un pointeur, mais vous n'avez pas initialisé, il pourrait partout ou nulle part. Vous devez l'initialiser, par exemple avec:...
C'est ok si vous avez initialisé
p
à point quelque part, sauf que vous pouvez débordement de la mémoire tampon il des points à si vous entrez trop de données. C'est ok pour un programme de test simple comme ça, mais dans la pratique, vous aurez envie de prendre des mesures pour l'éviter.&q
est de typechar*
, un pointeur verschar
. L'envoi d'unchar*
de la valeur àcout
ne pas imprimer sur la valeur du pointeur (une adresse de mémoire); il affiche la chaîne de caractères qu'il indique. (Bien que je suis l'obtention de certains résultats bizarres quand je lance moi-même; j'ai peut-être raté quelque chose.) Si vous voulez voir la valeur du pointeur, jette àvoid*
:(Ou vous pouvez utiliser un de C++spécifiques jette; je ne suis pas sûr de ce qui est mieux.)
Ici
q
est juste unchar
, donc il imprime sa valeur en tant que personnage:h
.OriginalL'auteur Keith Thompson
la chaîne lettré seront stockées dans .la section rdata qui sera en lecture seule, donc, la lecture en elle avec std cin serait de planter le programme
la deuxième chose , quand vous écrivez ceci :
alors que le pointeur p pointe vers un alloués et de la mémoire en lecture seule , comme la section rdata seront certainement affectés, et préparé par le chargeur de windows , mais comme je l'ai dit .rdata ne peut pas être modifié
puis, quand vous écrivez ceci :
vous n'attribuez q pour le premier char de p * renvoie la valeur du pointeur pointe actuellement vers donc, si vous avez essayé ceci :
le q tiendra 'a' pas de 'h', comme le pointeur est une adresse qui pointe vers un certains caractères du début de la première augmentation de par un il sera de rendre le pointer à la deuxième char et q tiendra cette valeur
OriginalL'auteur dev65
Meilleure façon de le faire est:
OriginalL'auteur Nagendra Reddy