Pointeurs C ++. partie 2





C ++ pointeurs, c ++ pointeurs

la partie nous avons considéré, que l'aide d'un opérateur de pointeur Nouveau morceau peut être identifié directement dans la taille requise au cours du programme. Juste appris, comme ce morceau de mémoire peut être libéré, en utilisant effacer. Nous avons vu comment les paramètres sont transférés à la fonction de pointeur. et, il permet de modifier la valeur des variables, qui sont transmis à la fonction.

Nous regardons maintenant un exemple où nous passons à la fonction d'un pointeur vers une chaîne (Les indices tels que carboniser). Cette fonction renvoie un pointeur sur lui-même. La tâche suivante: Il y a deux pointeurs vers des chaînes, dans lesquelles elles sont affectées aux zones de mémoire nécessaires. Il est nécessaire de combiner ces deux lignes. C'est, il est nécessaire d'allouer un nouveau bloc de mémoire pour la première ligne, pour permettre d'y ajouter une deuxième ligne.

avant, comment taper le code, que vous n'êtes pas “enterré” erreurs – Installer la dernière version de Microsoft environnement Visual Studio. Например Microsoft Visual Studio 2013 Express. Si vous utilisez une version antérieure, à la place des fonctions strcat_s() appliquer strcat() et strcpy() au lieu de strcpy_s().

Allons-y pour. En ligne 4 Il est un prototype de fonction. sa mission – allouer un nouveau bloc de mémoire pour la chaîne, à la fin de ce qui est écrit une autre ligne. Ceci sera discuté ci-dessous, quand nous arrivons à la définition de cette fonction,. Aller à la ligne 11 – 12. Ils définissent les variables, qui mémorise les valeurs des longueurs des cordes "rangée 1 " et "+ rangée 2". La longueur est calculée à l'aide de fonctions intégrées strlen(). Il retourne la longueur de la chaîne, à l'exclusion du symbole \0 . Par conséquent, lorsque l'initialisation des variables strsize1 et strsize2 on ajoute à cela le retour strlen(…) edïnïcw.

En ligne 14 pointeur défini pStr1 la première ligne. Pour écrire une chaîne, vous devez d'abord sélectionner en mémoire: carboniser* pStr1 = Nouveau carboniser[strsize1]; Voici copier une chaîne dans la mémoire allouée: strcpy_s(pStr1, strsize1, "rangée 1 "); . Le premier paramètre, qui reçoit la fonction strcpy_s() – un pointeur vers l'adresse où vous souhaitez copier une chaîne; deuxième – taille de ligne; troisième – la chaîne elle-même. Le deuxième pointeur pStr2 Nous définissons exactement.

La page. 20 – 21, s'il vous plaît montrer à l'écran la ligne enregistrée. Il suffit de se référer à eux par nom signes. Pointer stocke l'adresse cellule null. Lorsque nous demandons de le montrer à l'écran – sera alternativement affiché un tableau de caractères (la zone de mémoire, qui a été préalablement isolé), jusqu'à ce qu'un caractère newline – \0 .

pp. 23-24 – regardez combien d'octets de mémoire prend chaque ligne. rangée 26 supprimé un commentaire. Il a fait une tentative d'ajouter une deuxième ligne dans la première. Essayez de supprimer // et compiler le programme. La mise en œuvre du programme sera annulée erreur. Vous verrez l'écran suivant:

указатели на строки с++, pointeurs vers la ligne c ++, Nouveau, effacerBien sûr – parce que la zone de mémoire allouée sous la première ligne est trop petite, pour finir elle a des données. En ligne 28 écrire la variable RequiredSize vraiment nécessaire taille de la mémoire pour enregistrer deux lignes: int RequiredSize = (strsize1 + strsize2) - 1; Unité de soustraction parce, les variables strsize1 et strsize2 déjà inclus deux \0 , et nous avons besoin seulement un.

Accédez à la définition de giveNewMem() – pp. 42 – 51. Il prendra la première ligne (un pointeur vers elle) et entier (une quantité suffisante de mémoire). voir – nous avons besoin d'allouer un nouveau bloc de mémoire dans cette fonction pour l'écriture des caractères en elle. Ainsi, la fonction doit renvoyer un pointeur vers le nouvel emplacement de mémoire. Nous pouvons donc écrire à l'index pStr1 nouvelle adresse, dans lequel la mémoire est d'écrire deux lignes. Par conséquent, dans l'en-tête de la fonction écrire si carboniser* giveNewMem(carboniser *pstr1, int reqSize)

Depuis que le nouveau bloc de mémoire est mis en évidence, puis la mémoire, qui occupe la première ligne doit être libéré. Si nous faisons ce droit au début de la fonction – données (ligne de caractères) disparaître, parce que nous perdons l'adresse à laquelle ils se trouvent. Par conséquent, nous devrions être en fonction pour demander un nouveau bloc de mémoire, dans laquelle nous copions les caractères de la première ligne, avant que la mémoire Vacate.

Créez un nouveau répertoire et allouer immédiatement la mémoire pour elle, suffisant pour accueillir deux rangées de symboles (pp. 44). Copiez ensuite la mémoire sélectionnée dans la première rangée de caractères: strcpy_s(strInFunc, reqSize, pstr1); Chaîne skopirovana – vous devez libérer de la mémoire, elle a occupé, afin qu'il n'y ait une fuite de mémoire (pp. 48). Nous revenons d'un pointeur de fonction vers le nouvel emplacement de mémoire: retour strInFunc;

Il se trouve, quand nous appelons cette fonction à partir Principal() (pp. 31) pStr1 = giveNewMem(pStr1, RequiredSize); – indexé pStr1 adresse écrite de la nouvelle section de mémoire, qui est capable de loger deux lignes. Il ne reste plus qu'à ajouter dans la deuxième ligne de la mémoire (pp. 33) et l'afficher sur l'écran. Avant de quitter le programme libère la mémoire. Le premier qui a été allouée à la fonction, puis c'est là la deuxième ligne.

programme compiler:

указатели на строки с++, pointeurs vers la ligne c ++, Nouveau, effacer

Cet exemple montre, nous, l'utilisation de pointeurs, Nous pouvons disposer de RAM, jusqu'à l'octet.

A la fin de résumer et d'écrire de base, il est nécessaire de se rappeler à propos des pointeurs.

Pourquoi pointeurs en C ++?

  • l'utilisation de pointeurs, possible allocation de mémoire dynamique. Parce que la mémoire des données est publié dans le cadre du programme de travail, plutôt que lors de la compilation. Ceci est très bénéfique, quand nous ne savons pas à l'avance du programme sera utilisé comme données réelles (les variables). Pour allouer de la mémoire et gratuitement, utilisé par les opérateurs Nouveau et effacer.
  • Les indices sont souvent utilisés pour accéder à des portions du volume de données des fonctions. Données des tableaux symboliques et numériques tels, qui sont définies à l'extérieur de la fonction. Cette approche est venue du langage de programmation C. En C ++, les variables et les tableaux plus faciles à utiliser numériques relatifs transmission de liaison. Bientôt, nous allons examiner ce sujet. En ce qui concerne les lignes de style C est préférable d'appliquer pour le transfert du signe.
  • l'utilisation de pointeurs – nous travaillons avec la mémoire aux adresses directement. Il est plus rapide, que d'aller par le nom des variables.

Déclarant pointeurs, prenant adresses, déréférencer

Prenons l'exemple en détail:

En ligne 8 variable entière régulière définie. En ligne 9 commentée déclarer et initialiser le pointeur. Essayez de supprimer les signes de commentaire // et compiler. Nous signaler une erreur. bien. Il doit être un pointeur pour stocker l'adresse (nombre hexadécimal), pas la valeur (nombre décimal ou un symbole). à, pour obtenir l'adresse d'une variable utilisée par les adresses d'opération de capture & (Ampersand: Décalage + 7). En ligne 10 créer un index et écrit l'adresse de la variable:

инициализация указателя

Pour déterminer l'indice, Nous devons déclarer son type, pour le type d'un astérisque * et lui donner un nom. Initialiser le pointeur ne peut répondre. Si vous n'affectez un pointeur d'adresse dans sa déclaration, Initialisation à zéro. Ensuite, un pointeur peut conduire à des erreurs complexes, qui est difficile à trouver. Il a juste rien n'indiquera.

Habituellement, nous ne sommes pas particulièrement intéressés, qui stocke un pointeur d'adresse. Nous sommes intéressés par les données, situé à cette adresse. Pour afficher ces données (ou les modifier) Pointeur sur le nom de l'opération, il est nécessaire d'appliquer le déréférencement. Ceci est la même étoile *, ainsi que la déclaration.

déréférencement de pointeur

Cout flux seulement est traitée différemment – pas autant que dans la déclaration du curseur. Il aide à accéder à des données, stockée à l'adresse. Ceci est illustré dans la rangée 15 source.

En ligne 18 certains tselochislennыy tableau cinq éléments. Ci-dessous pointeur spécifié. S'il vous plaît noter – initialiser un pointeur sur le tableau d'adresses, opération & pas applicable. En effet,, que le nom du tableau se réfère à l'adresse de la cellule zéro. Il se trouve que le dossier

pointeur initialisation

normalement assez compilé. La variable pointeur pFirstArr adresse sera enregistrée zéro cellule de tableau firstArr. Cette entrée est similaire à la suivante

pointeur initialisation

En ligne 25 montre un exemple d'accès à des éléments de données dans le réseau via un pointeur. Utilisez la notation de tableau. Autrement dit, nous ne devons pas appliquer l'opération de déréférencement, pour accéder au réseau de données:

cout << "pfirstArr[0] = " << pFirstArr[0] << endl << endl;

boîte, bien sûr accéder au réseau de données, En utilisant la notation de pointeurs, mais il est peu commode. regardez, regardé comme si l'affectation des valeurs des éléments du tableau et afficher les valeurs sur l'écran:

lignes 27 – 28 source – définition Si-stroki et la détermination de ce pointeur de ligne. Les pointeurs sont très bons à travailler avec des cordes. Quand nous sommes dans l'appel courant Cout par nom à un pointeur sur un tableau de caractères, Il nous montrera toute la ligne. Comme dans le cas de réseaux, le compilateur affiche les caractères sur l'écran, jusqu'à ce qu'il trouve la fin de la chaîne de caractères dans le symbole de la matrice \0

Regardez les résultats du programme et le code source à nouveau. Essayez de comprendre comment il fonctionne.

pointeur initialisation, déréférencement de pointeur, & prenant adresses

une petite parenthèse, encourager ceux, qui est donné sujet pointeurs difficiles :) Vous n'êtes pas seul. Tout vient avec la pratique! Et il vient à vous! Ne paniquez pas, si cela semble trop confus pour vous. Résoudre le plus grand nombre possible les tâches de programmation. Même si vous faites quelque chose que vous ne le faites pas dans le processus de l'écriture de code, notre merveilleux environnement de développement va le savoir.

Assurez-vous de regarder la vidéo de marqueurs (avec 12 minutes), si vous ne l'avez pas vu dans la première partie de l'article:

Pointeurs, en tant que paramètres (arguments) fonction:




Bulletin de nouvelles leçons sur la programmation:

Pointeurs C ++. partie 2
4.5 (90%) 4 votes

9 réflexions sur "Pointeurs C ++. partie 2

  1. Je ne comprends pas , dans 15 ligne de code – strcpy_s(pStr1, strsize1, “rangée 1 “);
    fonction est utilisée dans strcpy_s 3 argument, plus haut dans la description de cette fonction, il indique seulement 2 argument (où la copie et que la copie).
    En fait, la question : pourquoi il est maintenant 3 argument? Parce que nous utilisons un pointeur comme premier argument? Ou parce qu'il est une nouvelle version de cette fonctionnalité (strcpy_s вместо strcpy)? Ou cette fonctionnalité Visual Studio? inutilement. Code в:: bloque la fonction strcpy prend 2 argument <>.

    1. Le code utilisé échantillon strcpy_s de fonction(), au lieu de strcpy(), qui a vraiment 2 argument. Voir les noms attentivement.

      P.S. Cela ne signifie pas, ce qui devrait être fait: strcpy_s() – fonction, non inclus dans toutes les normes POSIX, ни C, ou Linux, etc.. etc. … et est utilisé uniquement sur les systèmes d'exploitation Windows (vous ne trouverez même pas sa description dans la littérature). Mais cet exemple particulier – correct.

      1. Je me suis juste ce que je ne trouve pas la description des strcpy_s, Et pourquoi cette fonction, vous avez besoin de connaître la taille de la chaîne est pas clair.
        taille de la ligne, il est nécessaire de connaître parce que le premier argument un pointeur? Ou est-ce une caractéristique des fonctionnalités mises à jour? Et combien d'arguments cette fonction prend généralement (peut prendre) ?

    2. Indiquez la taille de la chaîne copiée est très utile: si la source de ligne, par hasard, aussi longtemps que le récepteur, vous recevrez une erreur d'accès mémoire avec l'effondrement de l'ensemble de l'application.

      Voir la description des fonctions de la bibliothèque standard et strncpy(), ce qui est plus sûr et de plus en plus utilisé dans le code professionnel que strcpy().

  2. L'environnement de développement DEV RPC 5.11.
    Le premier exemple fonctionne sans perevydeleniya fonction de mémoire :)

  3. “La chaîne est copiée - vous devez libérer de la mémoire, elle a occupé, afin qu'il n'y ait une fuite de mémoire (pp. 48).”
    48:effacer [] pstr1; // libère la mémoire pstr1
    pointeur pstr1 encore écrasé immédiatement
    31:pStr1 = giveNewMem(pStr1, RequiredSize);
    Normalement, compiler et exécuter sans ligne 48.

Laisser un commentaire

Votre adresse email ne sera pas publiée. les champs requis sont indiqués *