Fondamentaux C pointeur de la question de l'utilisation de 'strcpy'
L'homme, les pointeurs de continuer à me donner des problèmes. J'ai pensé que j'ai compris le concept.(En gros, que vous pouvez utiliser *ptr lorsque vous souhaitez manipuler la mémoire réelle enregistré à l'emplacement que ptr pointe. Vous utilisez simplement ptr si vous souhaitez déplacer le pointeur en faisant des choses comme ptr ptr++ ou--.) Donc, si c'est le cas, si vous utilisez l'astérisque pour manipuler les fichiers que le pointeur pointe vers, comment cela fonctionne:
char *MallocAndCopy( char *line ) {
char *pointer;
if ( (pointer = malloc( strlen(line)+1 )) == NULL ) {
printf( "Out of memory!!! Goodbye!\n" );
exit( 0 );
}
strcpy( pointer, line );
return pointer;
}
malloc renvoie un pointeur, donc je comprends pourquoi le "pointeur" dans la condition si ne pas utiliser l'astérisque. Cependant, dans la fonction strcpy, il envoie le CONTENU de la ligne pour le CONTENU du pointeur. Ne devrait-elle pas être:
strcpy( *pointer, *line);
????? Ou est ma compréhension de pointeurs correcte et qui est juste la manière que la fonction strcpy fonctionne?
OriginalL'auteur startuprob | 2010-10-13
Vous devez vous connecter pour publier un commentaire.
Un style C chaîne de caractères est un tableau de caractère octets. Lorsque vous passez un tableau autour comme un pointeur vers le type du tableau, le pointeur contient l'adresse du premier élément du tableau.
La
strcpy
fonction reçoit un pointeur vers la premièrechar
de la source de tableau (qui est le début de la chaîne) et le pointeur vers le premierchar
dans le tableau de destination, et parcourt la source jusqu'à ce qu'il atteigne une'\0'
caractère, ce qui termine la chaîne.C'est aussi pourquoi, lorsque vous appelez
malloc
, la taille que vous transmettez eststrlen(line)+1
, parce que vous avez besoin d'allouer un octet de plus pour le caractère de fin (que je sache).OriginalL'auteur Jengerer
char* strcpy(char *destination, const char *source)
est la signature destrcpy
. Il s'attend à obtenir des pointeurs comme arguments. Dans votre exemple,pointer
est déjà un pointeur, et donc estline
.strcpy
prendra les pointeurssource
etdestination
, et de copier le sous-jacent octets indiqués à partir desource
àdestination
jusqu'à ce qu'il frappe le\0
(NULL) octet de la chaîne pointée parsource
, ou si elle segmentation des défauts parce qu'il ne rencontre jamais que des octets (sans terminaison de chaîne) et tout d'un lit dans l'abîme.Si vous avez utilisé
*pointer
, vous serait en fait un déréférencement du pointeur et l'obtention de lachar
à l'adresse sur laquelle pointe le pointeur.OriginalL'auteur wkl
La signature de la fonction strcpy est
Que vous envoyez dans les pointeur char*, et la ligne qui est aussi char*. Ainsi, vous êtes à la correspondance de la signature exactement comme prévu. Envoi en *pointeur ou *ligne serait envoi 'les valeurs de ces pointeurs point pour", ce qui serait faux.
OriginalL'auteur Alex
scrcpy prend un pointeur, et écrit le contenu il pointe à la emplacement relevé par un autre pointeur. C'est comme la réécriture de contenu de la cellule dans le tableau. Vous n'avez pas nécessairement besoin de couper et coller une partie de la table, vous pouvez réécrire les nombres. Dans ce cas, le pointeur est juste un conseil dont les cellules que vous avez à toucher.
OriginalL'auteur
Regardez la déclaration de strpcy().
Vous avez besoin pour passer un pointeur. Si vous n'avez pas de déréférencement pointeur et ligne. Parce que ce serait le passage d'un char.
OriginalL'auteur Hans Passant
La
*
est à l'intérieur destrcpy
.L'application de la
*
opérateur est appelé déréférencement, et c'est exactement le même que l'application de la[0]
.strlen
etstrcpy
besoin de savoir où les cordes de démarrage de sorte qu'ils puissent accéder à l'ensemble de leurs éléments, et pas seulement la première.Le type de
pointer
estchar *
bien que le type de*pointer
estchar
, ce qui signifie un seul personnage qui n'a aucune notion de voisins caractères.OriginalL'auteur nategoose
Par écrit
*pointer
, vous obtenez le personnage qu'il pointe vers (qui se trouve être le premier caractère de la chaîne quipointer
représente). En passant àstrcpy
implique la création d'une copie de ce caractère. Il est impossible pourstrcpy
pour savoir où il doit être écrit, sauf si vous lui donnez un pointeur vers les données.Dans un mode similaire, en fournissant
*line
vous êtes seulement de donnerstrcpy
une copie de la première lettre de votre chaîne.Donc, vous êtes essentiellement en disant:
OriginalL'auteur Victor Nicollet
Je vois pourquoi vous attendre à passer
*pointer
et*line
àstrcpy
. Mais n'oubliez pas quepointer
points à l'endroit de la mémoire où le contenu est stocké et où il n'y astrlen(line)+1
octets de mémoire est réservé et attribué. Ainsi, cestrcpy
est exactement en train de faire est de copierstrlen(line)
octets de mémoire à partir de l'adresseline
dans les emplacements correspondants, à partir de l'adresse depointer
. Si vous passer*pointer
et*line
,strcpy
auront accès uniquement à la premièrechar
et pas le reste destrlen(line)-1
. Espérons que précise votre confusion sur les pointeurs et pourquoi nous avons besoin de passer des pointeurs àstrcpy
.OriginalL'auteur Pirooz
Votre compréhension de base de
strcpy
est correct. La fonction, en effet, des copies le contenu deline
sur le contenu depointer
. Cependant, vous avez à passer des pointeurs à la fonction et non les données elles-mêmes. Ceci est fait pour plusieurs raisons.Tout d'abord, les données qui sont en cours de copie est une chaîne de caractères (c'est-à-dire un tableau) et n'est pas régulier variable. Lors du passage d'un tableau à une fonction, vous ne pouvez pas fourrer le tableau d'ensemble dans un seul argument de fonction de sorte qu'au lieu que vous avez à passer un pointeur vers le début du tableau. C'est une limitation de la matrice de passage de C et n'est pas spécifique à
strcpy
.Aussi, le passage des données à une fonction la fonction avec un copie de la variable contenu. Si vous passé directement de données (ou de dé-référencé pointeurs) pour
strcpy
, la fonction serait de travailler avec des copies et pas les données d'origine. Il serait impossible d'écrire des données à la chaîne d'origine.Essentiellement, par la remise des pointeurs vers
strcpy
vous raconter l'emplacement de la source de données et de la destination. La fonction s'occupe de toutes les dé-référencement en interne. Dans le langage humain, l'appel àstrcpy
peut être considéré comme "prendre la chaîne qui commence à l'adresse de mémoireline
et écrire une copie à partir à l'adresse de mémoirepointer
". Pour communiquer des adresses de mémoire, vous utiliser des pointeurs.OriginalL'auteur bta
Considérer la fonction strcpy code:
\0(NULL) est le bout de la chaîne et de la boucle for.
OriginalL'auteur Amir Zadeh
Votre fonction est essentiellement ce que
strdup
. La fonction est définie sur de nombreuses plate-forme, si elle n'est pas, vous pouvez définir de cette façon:memcpy est généralement plus rapide que la fonction strcpy pour des chaînes plus longues.
OriginalL'auteur Patrick Schlüter