Čo je ukazovateľ v jazyku C?
Pointer v C, je premenná, ktorá ukladá riešiť iné premenné. Ukazovateľ je možné použiť aj na odkaz na inú funkciu ukazovateľa. Ukazovateľ je možné zvyšovať / znižovať, tj ukazovať na ďalšie / predchádzajúce miesto v pamäti. Účelom ukazovateľa je ušetriť miesto v pamäti a dosiahnuť rýchlejší čas vykonania.
Ako používať ukazovatele v jazyku C.
Ak deklarujeme premennú v typu int, v skutočne uloží hodnotu.
v sa teraz rovná nule.
Každá premenná má však okrem hodnoty aj svoju adresu (alebo, zjednodušene povedané, kde je umiestnená v pamäti). Adresu je možné získať vložením znaku & (&) pred názov premennej.
Ak vytlačíte adresu premennej na obrazovku, bude vyzerať ako úplne náhodné číslo (navyše sa môže líšiť od behu k behu).
Skúsme to v praxi pomocou ukazovateľa v príklade C.
Výstup tohto programu je -480613588.
Čo je to ukazovateľ? Namiesto ukladania hodnoty bude ukazovateľ y ukladať adresu premennej.
Ukazovateľ Premenná
Int * y = & v;
PREMENNÉ |
POINTER |
Hodnota uložená v pomenovanej skladovacie / adresa pamäti |
Variabilný , že odkazuje na storage / pamäťovú adresou iné premenné |
Deklarovanie ukazovateľa
Rovnako ako premenné, aj ukazovatele v programovaní C musia byť deklarované, aby mohli byť použité vo vašom programe. Ukazovatele je možné pomenovať, ako chcete, pokiaľ sa riadia pravidlami pomenovania C. Deklarácia ukazovateľa má nasledujúci tvar.
data_type * pointer_variable_name;
Tu,
- data_type je základný typ ukazovateľa typov premenných C a označuje typ premennej, na ktorú ukazovateľ ukazuje.
- Hviezdička (*: rovnaká hviezdička použitá pre násobenie), ktorá je operátorom smerovania, deklaruje ukazovateľ.
Pozrime sa na niektoré platné deklarácie ukazovateľov v tomto výučbe ukazovateľov C.
int *ptr_thing; /* pointer to an integer */int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */double *ptr2; /* pointer to a double */float *ptr3; /* pointer to a float */char *ch1 ; /* pointer to a character */float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */
Inicializovať ukazovateľ
Po vyhlásení ukazovateľa ho inicializujeme ako štandardné premenné s adresou premennej. Ak ukazovatele v programovaní C nie sú neinicializované a použité v programe, výsledky sú nepredvídateľné a potenciálne katastrofické.
Na získanie adresy premennej použijeme operátor ampersand (&), umiestnený pred názvom premennej, ktorej adresu potrebujeme. Inicializácia ukazovateľa sa vykonáva pomocou nasledujúcej syntaxe.
Syntax ukazovateľa
pointer = &variable;
Jednoduchý program na ilustráciu ukazovateľa je uvedený nižšie:
#includeint main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}
Výkon:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Prevádzkovateľ | Význam |
* | Slúži na 2 účely
|
& | Slúži iba na 1 účel
|
Typy ukazovateľov v C
Nasledujú rôzne typy ukazovateľov v jazyku C :
Nulový ukazovateľ
Nulový ukazovateľ môžeme vytvoriť priradením nulovej hodnoty počas deklarácie ukazovateľa. Táto metóda je užitočná, keď nemáte priradenú žiadnu adresu ukazovateľu. Nulový ukazovateľ vždy obsahuje hodnotu 0.
Nasledujúci program ilustruje použitie nulového ukazovateľa:
#includeint main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}
Výkon:
The value inside variable p is:0
Ukazovateľ neplatnosti
V programovaní C sa ukazovateľ neplatnosti nazýva aj ako všeobecný ukazovateľ. Nemá žiadny štandardný dátový typ. Ukazovateľ neplatnosti sa vytvorí pomocou kľúčového slova void. Môže sa použiť na uloženie adresy ľubovoľnej premennej.
Nasledujúci program ilustruje použitie ukazovateľa neplatnosti:
#includeint main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Výkon:
The size of pointer is:4
Divoký ukazovateľ
O ukazovateli sa hovorí, že je divoký, ak sa na nič neinicializuje. Tieto typy ukazovateľov C nie sú účinné, pretože môžu poukazovať na neznáme umiestnenie v pamäti, čo môže spôsobiť problémy v našom programe a viesť k zlyhaniu programu. Pri práci s divokými ukazovateľmi by ste mali byť vždy opatrní.
Nasledujúci program ilustruje použitie divokého ukazovateľa:
#includeint main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Výkon
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Ostatné typy ukazovateľov v „c“ sú:
- Visiaci ukazovateľ
- Komplexný ukazovateľ
- Blízko ukazovateľa
- Ďaleký ukazovateľ
- Obrovský ukazovateľ
Ukazovatele na priamy a nepriamy prístup
V jazyku C existujú dva ekvivalentné spôsoby prístupu k variabilnému obsahu a manipulácie s ním
- Priamy prístup: používame priamo názov premennej
- Nepriamy prístup: používame ukazovateľ na premennú
Poďme to pochopiť pomocou programu uvedeného nižšie
#include/* Declare and initialize an int variable */int var = 1;/* Declare a pointer to int */int *ptr;int main( void ){/* Initialize ptr to point to var */ptr = &var;/* Access var directly and indirectly */printf("\nDirect access, var = %d", var);printf("\nIndirect access, var = %d", *ptr);/* Display the address of var two ways */printf("\n\nThe address of var = %d", &var);printf("\nThe address of var = %d\n", ptr);/*change the content of var through the pointer*/*ptr=48;printf("\nIndirect access, var = %d", *ptr);return 0;}
Po zostavení programu bez akýchkoľvek chýb je výsledkom:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Aritmetika ukazovateľa v C
Operácie ukazovateľa sú zhrnuté na nasledujúcom obrázku

Prioritná operácia (priorita)
Pri práci s ukazovateľmi C musíme dodržiavať nasledujúce pravidlá priority:
- Operátory * a & majú rovnakú prioritu ako unárne operátory (negácia !, prírastok ++, dekrement--).
- V rovnakom výraze sa unárne operátory *, &,!, ++, - hodnotia sprava doľava.
Ak ukazovateľ P ukazuje na premennú X, potom je možné použiť * P všade, kde je možné zapísať X.
Nasledujúce výrazy sú ekvivalentné:
int X = 10 int * P = & Y; Pre vyššie uvedený kód platia nižšie uvedené výrazy | |
Vyjadrenie | Ekvivalentný výraz |
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ++ | Y = X + 1 X = X + 10 X + = 2 ++ X X ++ |
V druhom prípade sú potrebné zátvorky: keďže unárne operátory * a ++ sa vyhodnocujú sprava doľava, bez zátvoriek by sa zvýšil ukazovateľ P, nie objekt, na ktorý P ukazuje.
V nasledujúcej tabuľke sú uvedené aritmetické a základné operácie, ktoré je možné použiť pri práci s ukazovateľmi C.
Prevádzka | Vysvetlenie |
Postúpenie | int * P1, * P2 P1 = P2; P1 a P2 ukazujú na rovnakú celočíselnú premennú |
Prírastok a úbytok | Int * P1; P1 ++; P1-; |
Pridanie odsadenia (konštantné) | Toto umožňuje ukazovateľu presunúť N prvkov v tabuľke. Ukazovateľ sa zvýši alebo zníži o N-násobok počtu bajtov typu premennej. P1 + 5; |
Ukazovatele a polia s príkladmi
Tradične pristupujeme k prvkom poľa pomocou jeho indexu, ale túto metódu je možné vylúčiť použitím ukazovateľov. Ukazovatele uľahčujú prístup ku každému prvku poľa.
#includeint main(){int a[5]={1,2,3,4,5}; //array initializationint *p; //pointer declaration/*the ptr points to the first element of the array*/p=a; /*We can also type simply ptr==&a[0] */printf("Printing the array elements using pointer\n");for(int i=0;i<5;i++) //loop for traversing array elements{printf("\n%x",*p); //printing array elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}
Výkon
12345
Pridaním konkrétneho čísla k ukazovateľu sa umiestnenie ukazovateľa presunie na hodnotu získanú operáciou sčítania. Predpokladajme, že p je ukazovateľ, ktorý momentálne ukazuje na pamäťové miesto 0, ak vykonáme nasledujúcu operáciu sčítania, p + 1, potom sa vykoná týmto spôsobom:

Pretože p po pridaní 1 momentálne ukazuje na miesto 0, hodnota sa stane 1, a preto ukazovateľ bude ukazovať na miesto 1 v pamäti.
C Ukazovatele a reťazce s príkladmi
Reťazec je pole char objektov, končiace nulovým znakom „\ 0“. S reťazcami môžeme manipulovať pomocou ukazovateľov. Tento ukazovateľ v príklade C vysvetľuje túto časť
#include#include int main(){char str[]="Hello Guru99!";char *p;p=str;printf("First character is:%c\n",*p);p =p+1;printf("Next character is:%c\n",*p);printf("Printing all the characters in a string\n");p=str; //reset the pointerfor(int i=0;i Výkon
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!Ďalším spôsobom, ako zaobchádzať s reťazcami, je pole ukazovateľov, ako v nasledujúcom programe:
#includeint main(){char *materials[ ] = { "iron", "copper", "gold"};printf("Please remember these materials :\n");int i ;for (i = 0; i < 3; i++) {printf("%s\n", materials[ i ]);}return 0;} Výkon:
Please remember these materials:ironcoppergoldVýhody ukazovateľov v C
- Ukazovatele sú užitočné na prístup k miestam v pamäti.
- Ukazovatele poskytujú efektívny spôsob prístupu k prvkom štruktúry poľa.
- Ukazovatele sa používajú na dynamické alokovanie pamäte, ako aj na deallocation.
- Ukazovatele sa používajú na vytvorenie zložitých dátových štruktúr, ako je prepojený zoznam, graf, strom atď.
Nevýhody ukazovateľov v C
- Ukazovatele sú trochu zložité na pochopenie.
- Ukazovatele môžu viesť k rôznym chybám, ako sú poruchy segmentácie, alebo môžu získať prístup k miestu pamäte, ktoré nie je vôbec potrebné.
- Ak je ukazovateľovi poskytnutá nesprávna hodnota, môže to spôsobiť poškodenie pamäte.
- Ukazovatele sú tiež zodpovedné za únik pamäte.
- Ukazovatele sú porovnateľne pomalšie ako ukazovatele premenných.
- Programátori považujú prácu s ukazovateľmi za veľmi ťažkú; preto je povinnosťou programátora manipulovať s ukazovateľom opatrne.
Zhrnutie
- Ukazovateľ nie je nič iné ako pamäťové miesto, kde sú uložené údaje.
- Na prístup k umiestneniu v pamäti sa používa ukazovateľ.
- Existujú rôzne typy ukazovateľov, ako napríklad nulový ukazovateľ, divoký ukazovateľ, ukazovateľ neplatnosti a ďalšie typy ukazovateľov.
- Ukazovatele možno použiť s poľom a reťazcom na efektívnejší prístup k prvkom.
- Môžeme vytvoriť ukazovatele funkcií na dynamické vyvolanie funkcie.
- Aritmetické operácie je možné vykonávať na ukazovateli, ktorý je známy ako ukazovateľ aritmetický.
- Ukazovatele môžu tiež smerovať na funkciu, ktorá uľahčuje volanie rôznych funkcií v prípade definovania poľa ukazovateľov.
- Ak chcete pracovať s rôznymi typmi premenných údajov, môžete použiť ukazovateľ neplatnosti obsadenia typu.