mutatók c
Információgyűjtés írom ezt a cikket, eszembe jutott az első találkozás mutató - szomorúság, bánat volt ... Szóval elolvasása után néhány fejezetet a témában a különböző könyveket programozás C ++, úgy döntöttek, hogy menjen a különböző módon és bemutatni a témát C ++ mutatók a sorrendben, ahol jónak látom. Azonnal kapsz egy rövid definíció, és megvizsgálja a mutatók - a példákban. A következő cikkben (pointerek C ++. 2. rész) lesznek lefektetve árnyalatok vonalak használni mutatókat C-style (karakter tömbök) és a föld, hogy meg kell emlékezni.
Tekintsük a következő példát, akkor meg fogja érteni a legfontosabb dolog - miért van szükség a programozási mutató, mivel nyilvánítja és használatát.
Például a programban, létre kell hoznunk egy egész tömböt, a pontos méretét nem ismerjük megkezdése előtt a program. Azaz, nem tudjuk, hogy hány szám a felhasználónak kell, hogy ebben a tömbben. Természetesen tudunk biztosítani, és egy tömböt több ezer példány (például 5000). Ez (a mi szubjektív véleményünk) kell lennie ahhoz, hogy a felhasználó működését. Igen - tényleg - ez elég lehet. De ne felejtsük el, hogy ez a tömb fogja elfoglalni a sok memória (5000 * 4 (int típus) = 20 000 bájt). Ezután megtéveszt, és a felhasználó kitölti csak 10 elem a tömbben. Kiderült, hogy valójában 40 bájt a munka, és a 19960 bájt feleslegesen a memóriát.
indokolatlan használata RAM
A standard könyvtár funkció sizeof () Levél bejelentést tömb arrWithDigits 10. sort fog visszatérni arra a helyre a hívás bájt, amely elfoglalja a tömb a memóriában. A kérdés: „Hány számokat írja a tömb?” A válasz - 10. sor 15. összege * sizeof (int) kifejezést egyenértékű lenne 10 * 4 függvényében a sizeof (int) függvény 4 (akkora, mint egy int bájt). Ezután adjon meg egy számot a billentyűzeten és a program megmutatja őket a képernyőn. Kiderült, hogy a maradék 4990 elemeit fogja a nullák. Így nincs értelme megjeleníteni őket.
Itt fogjuk kiemelni piros operátor >>, mivel lehetetlen megváltoztatni a konstans érték. Itt vagyunk arra figyelmeztetett, hogy a tömb mérete nem érték lehet egy normális változó. Szükség van egy állandó érték!A következő példában fogjuk használni egy mutatót, és új szolgáltatók az Ön számára új (lefoglalt), és törölheti (memóriát szabadít fel).
megfontolt használatát memória használatával pointerek
using namespace std;
setlocale (LC_ALL "Rus".);
int sizeOfArray = 0; // a tömb méretét (a felhasználó belép)
cout <<"Чтобы создать массив чисел, введите его размер: " ;
cin >> sizeOfArray;
// a memóriában rész, amely biztosítja az új
int * arrWithDigits = új int [sizeOfArray];
A (int i = 0; i Így tehát a 16 vezetéken egy dinamikus tömb került meghatározásra. Ez azt jelenti, hogy a memória a, hogy kitűnjön (vagy nincs kiválasztva) futási időben helyett fordítási időben, mint ahogy az a hagyományos tömbök. Azaz, a memória kiosztás függ szoftverfejlesztés és megoldásokat, amelyek közvetlenül annak munkájában. Esetünkben - ez attól függ, hogy a felhasználó mit lépnek a változó sizeOfArray 25. sor használunk delete nyilatkozatot. Felszabadítja memóriát az új üzemeltető. Mivel az új memóriát elhelyezése a tömb, majd engedje el, ha szükség van annak egyértelművé tétele, hogy a fordító, hogy meg kell engedje a tömb memória, és nem csak a nulla sejt mutatott arrWithDigits. Ezért a neve, és törölje a mutató fel a szögletes zárójelek [] - törli [] arrWithDigits; Tartsuk szem előtt, hogy minden alkalommal, amikor memóriát új. akkor kiadja ezt a memóriát törölni. Természetesen a végén program memória által elfoglalt, ez automatikusan felszabadul. De hagyjuk az Ön számára lesz jó szokással new és delete operátorok egy pár. Végtére is, a program is található 5-6 tömbök például. És ha szabad a memóriába minden alkalommal, amikor már nincs szükség a jövőben a futó program - memória lesz töltött okosabban. Tegyük fel, hogy a mi programunk töltve a tömb tíz értékeket. Ezután megtaláljuk őket, és az összeg rögzített néhány változó. És mégis - minél több dolgozunk a tömb már nem. A program továbbra is dolgozni, és új, dinamikus tömbök benne valamilyen célra. Ebben az esetben célszerű, hogy kiadja a memória által elfoglalt első tömb. Aztán, amikor a memória kiosztás a többi ezt a memóriát tömbök felhasználhatók újra a programot. Fontolja meg az pointerek függvényében paramétereket. A kezdéshez adja és lefordítani a kódot. Kap egy két változó funkció, és a változtatásokat javasol az értéküket. megpróbálja módosítani a változók át a függvény
Minden kiderült - változó értékek változtak a funkciót.
Ne aggódj, ha valami nem világos. Van egy csomó új információt ebben a leckében - és ez teljesen normális, hogy nem minden érzékelik azonnal. Megértése mutatók jön a gyakorlattal. Megbeszéljük mutatók a második része a cikket, és poreshat feladat. Tehát minden rendben lesz.
Paraméterek (érvek) funkciók:
Olej.
Nagyon kétes állítást!
Egy sor helyi bejelentettek (funkció) kerül a verem, és törlődik befejezésekor a funkciót. Különösen azután, hogy a felbontás hatékonyan tömbök dinamikus határai C ++ 11 szabványt.
És használata a dinamikusan lefoglalt tömbök, bizonyos előnyöket, még több hátránya van.
Paradox.
A fordítóprogram „fordító: GNU GCC fordítóprogram” került be az alábbi kódot:
using namespace std;
int main ()
setlocale (LC_ALL, "orosz");
int SizeOfArray;
cout <<"Сколько чисел вы введёте в массив? " <> SizeOfArray;
int arrWithDigits [SizeOfArray] = <>;
A (int i = 0; i A (int i = 0; i A program, amelyben dolgozom Code :: blokk 16.01. mingw32-g ++ exe -Wall -g -C C :. \ 2 \ codeblocks-16.01 \ Code \ Zadacha12 \ Zadacha12.cpp -o obj \ Debug \ Zadacha12.o Olej. A paradoxon akkor mi van?
>
cout <
cout <
>
----- épít: Debug in Zadacha12 (compiler: GNU GCC fordítóprogram) -----
mingw32-g ++. exe -o bin \ Debug \ Zadacha12.exe obj \ Debug \ Zadacha12.o
Kimeneti fájl bin \ Debug \ Zadacha12.exe méretű 1,01 MB
Process megszűnik állapota 0 (0 perc (s), 0 másodperces (ek))
0 hiba (s), 0 figyelmeztetés (ek) (0 perc (s), 0 másodperces (ek))
GCC fordító sokkal tökéletesebb, mint a fordító a Microsoft, és sokkal pontosabb szintaxis megfelel a C ++ nyelven.