Co jsou ukazatele?
V C ++ ukazatel odkazuje na proměnnou, která obsahuje adresu jiné proměnné. Stejně jako běžné proměnné mají ukazatele datový typ. Například ukazatel typu integer může obsahovat adresu proměnné typu integer. Ukazatel typu znaků může obsahovat adresu proměnné typu znaků.
Ukazatel byste měli vidět jako symbolické znázornění adresy paměti. Pomocí ukazatelů mohou programy simulovat call-by-reference. Mohou také vytvářet a manipulovat s dynamickými datovými strukturami. V C ++ proměnná ukazatele odkazuje na proměnnou ukazující na konkrétní adresu v paměti namířené jinou proměnnou.
V tomto výukovém programu C ++ se naučíte:
- Co jsou ukazatele?
- Adresy v C ++
- Syntaxe deklarace ukazatele
- Referenční operátor (&) a operátor Deference (*)
- Ukazatele a pole
- Ukazatel NULL
- Ukazatele proměnných
- Aplikace ukazatelů
- Výhody používání ukazatelů
Adresy v C ++
Abychom porozuměli ukazatelům C ++, musíte pochopit, jak počítače ukládají data.
Když vytvoříte proměnnou v programu C ++, je jí přidělen určitý prostor paměti počítače. Hodnota této proměnné je uložena v přiřazeném umístění.
Abychom poznali umístění v paměti počítače, kde jsou data uložena, poskytuje C ++ operátor & (reference). Operátor vrátí adresu, kterou zabírá proměnná.
Například pokud x je proměnná, & x vrátí adresu proměnné.
Syntaxe deklarace ukazatele
Deklarace C ++ má následující syntaxi:
datatype *variable_name;
- Datový typ je základní typ ukazatele, který musí být platným datovým typem C ++.
- Název proměnné je měl by být název proměnné ukazatele.
- Hvězdička použitá výše pro deklaraci ukazatele je podobná hvězdičce používané k provedení operace násobení. Je to hvězdička, která označuje proměnnou jako ukazatel.
Zde je příklad platných deklarací ukazatelů v C ++:
int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character
Referenční operátor (&) a operátor Deference (*)
Referenční operátor (&) vrátí adresu proměnné.
Operátor dereference (*) nám pomáhá získat hodnotu, která byla uložena na adresu paměti.
Například:
Pokud máme proměnnou s názvem num, uloženou na adrese 0x234 a ukládající hodnotu 28.
Referenční operátor (&) vrátí 0x234.
Operátor dereference (*) vrátí 5.
Příklad 1:
#includeusing namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}
Výstup:
Jak to funguje:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Importujte soubor záhlaví iostream. To nám umožní používat funkce definované v hlavičkovém souboru bez chyb.
- Chcete-li používat své třídy, aniž byste jej volali, zahrňte standardní obor názvů.
- Zavolejte funkci main (). Logika programu by měla být přidána do těla této funkce. {Označuje začátek těla funkce.
- Deklarujte celočíselnou proměnnou x a přiřaďte jí hodnotu 27.
- Deklarujte proměnnou ukazatele * ip.
- Uložte adresu proměnné x do proměnné ukazatele.
- Vytiskněte nějaký text na konzoli.
- Vytiskněte hodnotu proměnné x na obrazovku.
- Vytiskněte nějaký text na konzoli.
- Vytiskněte adresu proměnné x. Hodnota adresy byla uložena v proměnné ip.
- Vytiskněte nějaký text na konzoli.
- Hodnota tisku uložená na adrese ukazatele.
- Program by měl po úspěšném provedení vrátit hodnotu.
- Konec těla funkce main ().
Ukazatele a pole
Pole a ukazatele fungují na základě souvisejícího konceptu. Při práci s poli s ukazateli je třeba si uvědomit různé věci. Samotný název pole označuje základní adresu pole. To znamená, že k přiřazení adresy pole ukazateli byste neměli používat ampersand (&).
Například:
p = arr;
Výše uvedené je správné, protože arr představuje adresu polí. Zde je další příklad:
p = &arr;
Výše uvedené je nesprávné.
Můžeme implicitně převést pole na ukazatel. Například:
int arr [20];int * ip;
Níže je platná operace:
ip = arr;
Po výše uvedené deklaraci budou ip a arr ekvivalentní a budou sdílet vlastnosti. K ip však lze přiřadit jinou adresu, ale nemůžeme přiřadit nic k příchodu.
Příklad 2:
Tento příklad ukazuje, jak procházet pole pomocí ukazatelů:
#includeusing namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Deklarujte celočíselnou proměnnou ip.
- Deklarujte pole s názvem arr a uložte do něj 6 celých čísel.
- Přiřadit arr na ip. IP a arr se stanou rovnocennými.
- Vytvořte smyčku pro. Proměnná smyčky x byla vytvořena k iteraci nad prvky pole od indexu 0 do 5.
- Vytiskněte hodnoty uložené na adrese ukazatele IP. Na jednu iteraci bude vrácena jedna hodnota a bude provedeno celkem 6 opakování. Endl je klíčové slovo C ++, které znamená koncový řádek. Tato akce umožňuje po vytištění každé hodnoty přesunout kurzor na další řádek. Každá hodnota bude vytištěna v samostatném řádku.
- Chcete-li po každé iteraci přesunout ukazatel na další pozici int.
- Konec smyčky pro.
- Po úspěšném provedení musí program něco vrátit.
- Konec hlavního () funkčního těla.
Ukazatel NULL
Pokud neexistuje žádná přesná adresa, která má být přiřazena, lze proměnné ukazatele přiřadit NULL. To by mělo být provedeno během deklarace. Takový ukazatel se nazývá nulový ukazatel. Jeho hodnota je nula a je definována v mnoha standardních knihovnách, jako je iostream.
Příklad 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Deklarujte ukazatel proměnné ip a přiřaďte mu hodnotu NULL.
- Tisknout hodnotu proměnné ukazatele ip vedle nějakého textu na konzole.
- Po úspěšném dokončení musí program vrátit hodnotu.
- Konec těla funkce main ().
Ukazatele proměnných
S C ++ můžete manipulovat s daty přímo z paměti počítače.
Paměťový prostor lze podle potřeby přiřadit nebo znovu přiřadit. To umožňují ukazatele Pointer.
Proměnné ukazatele ukazují na konkrétní adresu v paměti počítače, na kterou ukazuje jiná proměnná.
Lze jej deklarovat takto:
int *p;
Nebo,
int* p;
V našem příkladu jsme deklarovali proměnnou ukazatele p.
Bude obsahovat adresu paměti.
Hvězdička je operátor dereference, který znamená ukazatel na.
Ukazatel p ukazuje na celočíselnou hodnotu v adrese paměti.
Příklad 4:
#includeusing namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Deklarujte ukazatel proměnné p a proměnnou x s hodnotou 30.
- Přiřaďte adresu proměnné x p.
- Vytiskněte hodnotu proměnné ukazatele p vedle nějakého textu na konzole.
- Po úspěšném dokončení musí program vrátit hodnotu.
- Konec těla funkce main ().
Aplikace ukazatelů
Funkce v C ++ mohou vrátit pouze jednu hodnotu. Dále jsou všechny proměnné deklarované ve funkci přiděleny na zásobníku volání funkcí. Jakmile se funkce vrátí, všechny proměnné zásobníku budou zničeny.
Argumenty k funkci jsou předávány podle hodnoty a jakákoli úprava provedená u proměnných nezmění hodnotu skutečných proměnných, které jsou předány. Následující příklad pomáhá ilustrovat tento koncept: -
Příklad 5:
#includeusing namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}
Výstup:
Zde je snímek obrazovky s kódem:
Vysvětlení kódu:
- Vytvořte prototyp funkce s názvem test, který bude trvat dva celočíselné parametry.
- Zavolejte funkci main (). Přidáme logiku programu do jeho těla.
- Deklarujte dvě celočíselné proměnné a a b, každá s hodnotou 5.
- Vytiskněte nějaký text na konzoli. Endl (koncový řádek) posune kurzor a začne tisknout na dalším řádku.
- Vytiskněte hodnotu proměnné a na konzole spolu s dalším textem. Endl (koncový řádek) posune kurzor a začne tisknout na dalším řádku.
- Vytiskněte hodnotu proměnné b na konzole spolu s dalším textem. Endl (koncový řádek) posune kurzor a začne tisknout na dalším řádku.
- Vytvořte funkci s názvem test (), která jako parametry převezme adresy proměnných aab.
- Vytiskněte nějaký text na konzoli. \ N vytvoří nový prázdný řádek před vytištěním textu. Endl (koncový řádek) posune kurzor a začne tisknout na dalším řádku po vytištění textu.
- Vytiskněte hodnotu proměnné a na konzole spolu s dalším textem. Endl (koncový řádek) posune kurzor a začne tisknout na dalším řádku.
- Vytiskněte hodnotu proměnné b na konzole spolu s dalším textem. Endl (koncový řádek) posune kurzor a začne tisknout na dalším řádku.
- Po úspěšném dokončení musí program vrátit hodnotu.
- Konec těla funkce main ().
- Definování funkčního testu (). Funkce by měla mít dvě proměnné celočíselného ukazatele * n1 a * n2.
- Přiřazení proměnné ukazatele * n1 na hodnotu 10.
- Přiřazení proměnné ukazatele * n2 na hodnotu 11.
- Konec těla funkčního testu ().
I když jsou nové hodnoty přiřazeny proměnným a a b uvnitř testu funkce, jakmile je volání funkce dokončeno, to samé neodráží vnější funkci main.
Použití ukazatelů jako argumentů funkce pomáhá předat skutečnou adresu proměnné ve funkci a všechny změny provedené v proměnné se projeví ve vnější funkci.
Ve výše uvedeném případě má funkce 'test' adresu proměnných 'a' a 'b.' Tyto dvě proměnné jsou přímo přístupné z funkce „test“, a proto se jakákoli změna provedená v těchto proměnných projeví ve funkci volajícího „hlavní“.
Výhody používání ukazatelů
Zde jsou výhody / výhody používání ukazatelů
- Ukazatele jsou proměnné, které ukládají adresu dalších proměnných v C ++.
- Více než jednu proměnnou lze upravit a vrátit pomocí funkce pomocí ukazatelů.
- Paměť lze dynamicky přidělit a zrušit přidělení pomocí ukazatelů.
- Ukazatele pomáhají zjednodušit složitost programu.
- Rychlost provádění programu se zlepšuje pomocí ukazatelů.
Souhrn:
- Ukazatel odkazuje na adresu přidržující proměnnou jiné proměnné.
- Každý ukazatel má platný datový typ.
- Ukazatel je symbolické znázornění adresy paměti.
- Ukazatele umožňují programům simulovat call-by-reference a vytvářet a manipulovat s dynamickými datovými strukturami.
- Pole a ukazatele používají související koncept.
- Název pole označuje základ pole.
- Pokud chcete přiřadit adresu pole ukazateli, nepoužívejte ampersand (&).
- Pokud neexistuje žádná konkrétní adresa pro přiřazení proměnné ukazatele, přiřaďte jí NULL.