Co je Ukazatel v C?
Ukazatel v C, je proměnná, která ukládá adresu jiné proměnné. Ukazatel lze také použít k odkazu na jinou funkci ukazatele. Ukazatel může být zvýšen / snížen, tj. Aby ukazoval na další / předchozí umístění paměti. Účelem ukazatele je ušetřit místo v paměti a dosáhnout rychlejšího času provádění.
Jak používat ukazatele v C
Pokud deklarujeme proměnnou v typu int, v ve skutečnosti uloží hodnotu.
v se nyní rovná nule.
Každá proměnná má však kromě hodnoty také svoji adresu (nebo jednoduše řečeno, kde se nachází v paměti). Adresu lze získat vložením ampersandu (&) před název proměnné.
Pokud na obrazovku vytisknete adresu proměnné, bude vypadat jako zcela náhodné číslo (navíc se může lišit od běhu k běhu).
Zkusme to v praxi s ukazatelem v C příklad
Výstup tohoto programu je -480613588.
Co je to ukazatel? Místo uložení hodnoty bude ukazatel ukládat adresu proměnné.
Proměnná ukazatele
Int * y = & v;
VARIABILNÍ |
POINTER |
Hodnota uložená na pojmenované adrese úložiště / paměti |
Proměnná, která ukazuje na adresu úložiště / paměti jiné proměnné |
Deklarace ukazatele
Stejně jako proměnné, ukazatele v C progra Před použitím ve vašem programu je třeba deklarovat mming. Ukazatele lze pojmenovat, kamkoli chcete, pokud se řídí pravidly pojmenování C. Deklarace ukazatele má následující podobu.
data_type * pointer_variable_name;
Zde,
- data_type je základní typ ukazatele typů proměnných C a označuje typ proměnné, na kterou ukazatel ukazuje.
- Hvězdička (*: používá se stejná hvězdička pro multiplikaci), což je operátor nesměrování, deklaruje ukazatel.
Podívejme se na některá platná deklarace ukazatele v tomto tutoriálu ukazatelů jazyka C:
Inicializovat ukazatel
Po deklaraci ukazatele jej inicializujeme jako standardní proměnné s adresou proměnné. Pokud ukazatele v programování C nejsou neinicializovány a použity v programu, výsledky jsou nepředvídatelné a potenciálně katastrofické.
K získání adresy proměnné používáme operátor ampersand (&), který je umístěn před názvem proměnné, jejíž adresu potřebujeme. Inicializace ukazatele se provádí s následující syntaxí.
Syntaxe ukazatele
pointer = &variable;
Níže je uveden jednoduchý program pro ilustraci ukazatele:
Výstup:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
operátor | význam |
* | Slouží 2 účelům
|
& | Slouží pouze jednomu účelu
|
Typy ukazatelů v C
Následují různé typy ukazatelů v jazyce C:
Null Pointer
Null pointer můžeme vytvořit přiřazením hodnoty null během deklarace ukazatele. Tato metoda je užitečná, pokud ukazateli nemáte přiřazenou žádnou adresu. Nulový ukazatel vždy obsahuje hodnotu 0.
Následující program ilustruje použití nulového ukazatele:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Výstup:
The value inside variable p is:0
Void Pointer
V programování C je ukazatel void také nazýván jako obecný ukazatel. Nemá žádný standardní datový typ. Ukazatel void je vytvořen pomocí klíčového slova void. Lze jej použít k uložení adresy jakékoli proměnné.
Následující program ilustruje použití ukazatele neplatnosti:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Výstup:
The size of pointer is:4
Divoký ukazatel
Ukazatel je považován za divoký ukazatel, pokud není na nic inicializován. Tyto typy ukazatelů C nejsou efektivní, protože mohou ukazovat na nějaké neznámé místo v paměti, což může způsobit problémy v našem programu a může to vést k havárii programu. Při práci s divokými ukazateli byste měli být vždy opatrní.
Následující program ilustruje použití divokého ukazatele:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Výstup
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Další typy ukazatelů v „c“ jsou následující:
- Houpající se ukazatel
- Složitý ukazatel
- Blízký ukazatel
- Daleko ukazatel
- Obrovský ukazatel
Ukazatele přímého a nepřímého přístupu
V jazyce C existují dva ekvivalentní způsoby pro přístup a manipulaci s obsahem proměnné
- Přímý přístup: používáme přímo název proměnné
- Nepřímý přístup: používáme ukazatel na proměnnou
Nechte to pochopit pomocí níže uvedeného programu
Po kompilaci programu bez jakýchkoli chyb je výsledkem:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Aritmetika ukazatele v jazyce C
Operace ukazatele jsou shrnuty na následujícím obrázku
Prioritní operace (priorita)
Při práci s ukazateli C musíme dodržovat následující pravidla priority:
Pokud ukazatel P ukazuje na proměnnou X, lze použít * P všude tam, kde lze napsat X.
Následující výrazy jsou ekvivalentní:
V druhém případě jsou potřeba závorky: protože unární operátory * a ++ jsou vyhodnocovány zprava doleva, bez závorek je ukazatel P bude zvýšen, ne objekt, na který P body.
Níže uvedená tabulka ukazuje aritmetické a základní operace, které lze použít při práci s ukazateli C.
Provoz | Vysvětlení |
Přiřazení | int * P1, * P2 P1 = P2; P1 a P2 ukazují na stejnou celočíselnou proměnnou |
Inkrementace a dekrementace | Int * P1; P1 ++; P1-; |
Přidání posunutí (konstantní) | To umožňuje ukazateli přesouvat N prvků v tabulce. Ukazatel se zvýší nebo sníží o N-násobek počtu bajtů typu proměnné. P1 + 5; |
C ukazatele & pole s příklady
Tradičně jsme přistupovat k prvkům pole pomocí jeho indexu, ale tuto metodu lze eliminovat pomocí ukazatelů. Ukazatele usnadňují přístup ke každému prvku pole.
Výstup
12345
Přidání konkrétního čísla k ukazateli přesune umístění ukazatele na hodnotu získanou operací přidání. Předpokládejme, že p je ukazatel, který aktuálně ukazuje na paměťové místo 0, pokud provedeme následující operaci přidání, p + 1, pak se provede tímto způsobem:
Protože p aktuálně ukazuje na místo 0 po přidání 1, hodnota se stane 1, a proto ukazatel bude ukazovat na místo v paměti 1.
C ukazatele a řetězce s příklady
Řetězec je pole char objektů, končící nulovým znakem „\ 0“. S řetězci můžeme manipulovat pomocí ukazatelů. Tento ukazatel v příkladu C vysvětluje tuto část.
Výstup
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
Další způsob řešení řetězců je s řadou ukazatelů, jako v následujícím program:
Výstup:
Please remember these materials:ironcoppergold
Výhody ukazatelů v C
- Ukazatele jsou užitečné pro přístup umístění paměti.
- Ukazatele poskytují efektivní způsob přístupu k prvkům struktury pole.
- Ukazatele se používají pro dynamickou alokaci paměti i pro přidělení.
- Ukazatele se používají k vytváření složitých datových struktur, jako je propojený seznam, graf, strom atd.
Nevýhody ukazatelů v jazyce C
- Ukazatele jsou trochu složité rozumět.
- Ukazatele mohou vést k různým chybám, jako jsou poruchy segmentace, nebo mohou přistupovat k místu paměti, které vůbec není nutné.
- Pokud je ukazateli poskytnuta nesprávná hodnota může to způsobit poškození paměti.
- Ukazatelé jsou také zodpovědní za únik paměti.
- Ukazatele jsou poměrně pomalejší než ukazatele proměnných.
- Programátoři považují za velmi obtížné s ukazateli pracovat; proto je povinností programátora pečlivě manipulovat s ukazatelem.
Shrnutí
- Ukazatel není nic jiného než paměťové místo, kde jsou uložena data.
- Ukazatel se používá pro přístup k umístění v paměti.
- Existují různé typy ukazatelů, například nulový ukazatel, divoký ukazatel, ukazatel neplatnosti a další typy ukazatelů.
- Ukazatele lze použít s maticí a řetězcem pro efektivnější přístup k prvkům.
- Můžeme vytvořit ukazatele funkcí, které dynamicky vyvolají funkci.
- Aritmetické operace lze provádět na ukazateli známém jako aritmetika ukazatele.
- Ukazatele mohou také ukazovat na funkce, což usnadňuje volání různých funkcí v případě definování pole ukazatelů.
- Pokud chcete pracovat s různými datovými typy proměnných, můžete použít ukazatel obsadit neplatnost.