Mutasson a c
Az első részben megvizsgáltuk, hogy miként használjuk a mutatót és az új operátort, ha a program fut, a szükséges méret memóriájának egy részét közvetlenül fel lehet osztani. Azt is megtudtuk, hogy a memória ezen területe felszabadítható a törléssel. Megtettük, hogy a paramétereket a mutatóhoz hogyan adják át a függvénynek. És az a tény, hogy ez lehetővé teszi a változók értékének megváltoztatását, amelyek átkerülnek a függvényre.
Most egy olyan példát fogunk megnézni, ahol a mutatókat a karakterláncokra (char-mutatók) mutatjuk be. A függvény egy mutatót visz vissza. A feladat a következő: A vonalaknak két mutatója van, amelyek alatt a szükséges memória területeket hozzárendelik. E két vonalat össze kell kötni. Ez azt jelenti, hogy az első sorra új memóriaterületet kell felosztani, így lehetséges a második sor kitöltése.
egy új elegendő memória elosztása a sorhoz
Rendben megyünk. A 4. sor tartalmazza a funkció prototípust. Feladata az, hogy új vonalat hozzárendel egy olyan vonalhoz, amelynek végén egy másik vonal írható. Ezt az alábbiakban részletezzük, amikor eljutunk a funkció meghatározásába. Lépjen a 11-12 sorokra, amelyek meghatározzák azokat a változókat, amelyek az "1. sor" és a "+ 2. sor" sorainak hosszúságát tárolják. A hossz kiszámítása a beépített strlen () függvény használatával történik. Vissza fog térni a húr hosszát figyelembe vétele nélkül a karakter \ 0. Ezért az inicializálás változók és strSize1 strSize2 hozzávesszük, hogy a visszatérés strlen (...) egységet.
Természetesen - mivel az első sorra kiosztott memória túl kicsi ahhoz, hogy további adatokat adjon hozzá. Az írási 28. sor a változó requiredSize tényleges memória mérete köteles rögzíteni két sor: int requiredSize = (strSize1 + strSize2) - 1; A készüléket elveszik, mert két \ 0 már szerepel a strSize1 és a strSize2 változókban, és csak egyre van szükségünk.Hozzon létre egy új mutatót, és azonnal hozzárendeljen hozzá egy memóriát, ami elegendő mindkét sor karakterének elhelyezésekor (44. oldal). Ezután másolja az első sor karaktereit a hozzárendelt memóriába: strcpy_s (strInFunc.reqSize.pstr1); A karakterlánc másolásra kerül - fel kell szabadítani a foglalt memóriát, így nincs memória szivárgás (48. oldal). Visszatérés a mutatóból egy új memóriahelyre: return strInFunc;
Ez a példa azt mutatta, hogy a mutatók segítségével a RAM-ot egy bájtban tudjuk kezelni.
Végül összegezzük és jelöljük a legfontosabb dolgot, amelyet meg kell emlékeznünk a mutatókra.
Miért van szükségem mutatókra a C ++-ban?
Nézzünk részletesen egy példára:
A 25. sor egy mutatós elemek adatelemeinek elérését mutatja. Array-jelölést használunk. Vagyis nem kell a dereferencing műveletet használni a tömbadatok eléréséhez:
cout <<"pfirstArr[0] = " < Természetesen elérheti a tömb adatait a pointer-jelöléssel, de ez kényelmetlen. Nézd meg, hogyan néz ki az értékek a tömb elemekhez és megjeleníti az értékeket a képernyőn: A forráskód 27-28-as sorai - a C-string definíciója és egy mutató meghatározása erre a sorra. A mutatók figyelemre méltóan jóak a húrok használatával. Amikor a cout streamben egy karakter tömbre mutatunk egy mutatót, megmutatja nekünk az egész karakterláncot. Ugyanúgy, mint a tömbök esetén, a fordító a karaktereket a képernyőre továbbítja, amíg nem találja a sor végét a \ 0 Nézze meg ismét a program és a forráskód eredményét. Próbálja meg megérteni, hogyan működik.
Egy másik eltérés a témától, hogy felvidítsák azokat, akik erősen kapják a mutatók témáját :) Nem vagy egyedül. Minden a gyakorlatban jön! És ez jön hozzád! Ne pánik, ha túl zavarosnak tűnik számodra. A lehetséges programozási feladatok megoldása. Még akkor is, ha valamit rosszul csinál a kódírás folyamatában, csodálatos fejlesztési környezetünk tudatja velünk.
Mutatók paraméterekként (argumentumok):
Nem értem. a kód 15 sorában - strcpy_s (pStr1, strSize1, "1 sor");
a strcpy_s 3 függvényben, amelyet korábban a függvény leírásában használtunk, csak két argumentumot (ahol másolnunk és másolnunk kell).
Valójában a kérdés. miért vannak 3 érvek ebben? Mert most a mutatót használjuk az első érvként? Vagy azért, mert ez egy új változata ennek a függvénynek (strcpy_s helyett strcpy)? Vagy a vizuális stúdió ezen tulajdonsága? mert a kódot. A blokk funkciók strcpy 2 argumentumot tartalmaz <>.
A kód példa a strcpy_s () függvényt használja, nem strcpy (), amely valójában 2 argumentummal rendelkezik. Nézze meg a neveket.
Ui Ez nem jelenti azt, hogy ezt meg kell tennie: a strcpy_s () egy olyan függvény, amely nem tartozik a POSIX, C, Linux, stb szabványokhoz. és hasonlók. ... és csak Windows operációs rendszerekben használják (a szakirodalomban nem találja meg a leírásait sem). De a konkrét példa helyes.
Csak azt értettem, hogy a strcpy leírások nem találom, de miért nem tudom, hogy ez a függvény milyen mértékben ismeri a húr méretét.
Meg kell tudnod a karakterlánc méretét, mert az első argumentum egy mutató? Vagy a felújított funkció egyik jellemzője? És hány érvelés ezt a funkciót általában elfogadja (megteheti)?
A másolásra váró vonal méretének meghatározása nagyon hasznos: ha a forráskód véletlenül hosszabb, mint a vevőegység, memória hozzáférési hibát kap a teljes alkalmazás összeomlásával.
Tekintse meg a strncpy () könyvtár és a standard függvény leírását, ami biztonságosabb és gyakrabban használatos a professzionális kódnál, mint a strcpy ().