mutatók c

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.

mutatók c

mutatók c
Itt fogjuk kiemelni piros operátor >>, mivel lehetetlen megváltoztatni a konstans érték.

mutatók c
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

mutatók c

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 cout < arrWithDigits [i];
>
cout <

A (int i = 0; i cout <>
cout < vissza 0;
>

A program, amelyben dolgozom Code :: blokk 16.01.
----- épít: Debug in Zadacha12 (compiler: GNU GCC fordítóprogram) -----

mingw32-g ++ exe -Wall -g -C C :. \ 2 \ codeblocks-16.01 \ Code \ Zadacha12 \ Zadacha12.cpp -o obj \ Debug \ Zadacha12.o
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))

Olej.

A paradoxon akkor mi van?
GCC fordító sokkal tökéletesebb, mint a fordító a Microsoft, és sokkal pontosabb szintaxis megfelel a C ++ nyelven.