Pekare i C: Vad är Pekare i C-programmering? Typer
Vad är Pointer i C?
Ocuco-landskapet Pointer i C, är en variabel som lagrar adressen till en annan variabel. En pekare kan också användas för att referera till en annan pekarfunktion. En pekare kan ökas/minskas, dvs för att peka på nästa/föregående minnesplats. Syftet med pekaren är att spara minnesutrymme och uppnå snabbare exekveringstid.
Hur man använder pekare i C
Om vi deklarerar en variabel v av typen int, kommer v faktiskt att lagra ett värde.
v är lika med noll nu.
Men varje variabel, förutom värde, har också sin adress (eller, enkelt uttryckt, där den finns i minnet). Adressen kan hämtas genom att sätta ett et-tecken (&) före variabelnamnet.
Om du skriver ut adressen till en variabel på skärmen kommer den att se ut som ett totalt slumpmässigt tal (desutom kan det vara olika från körning till körning).
Låt oss prova detta i praktiken med pekaren i C-exemplet
Resultatet av detta program är -480613588.
Nu, vad är en pekare? Istället för att lagra ett värde kommer en pekare att lagra adressen till en variabel.
Pekarvariabel
Int *y = &v;
VARIABEL | PEKARE |
---|---|
A värde lagras i en som heter lagrings-/minnesadress | A variabel den där pekar på lagrings-/minnesadressen för annan variabel |
Deklarerar en pekare
Som variabler, pekare in C-programmering måste deklareras innan de kan användas i ditt program. Pekare kan heta vad du vill så länge de följer C:s namnregler. En pekardeklaration har följande form.
data_type * pointer_variable_name;
Här,
- data typ är pekarens bastyp av C:s variabeltyper och anger vilken typ av variabel som pekaren pekar på.
- Asterisken (*: samma asterisk som används för multiplikation) som är indirektionsoperator, deklarerar en pekare.
Låt oss se några giltiga pekardeklarationer i denna handledning för C-pekare:
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 */
Initiera en pekare
Efter att ha deklarerat en pekare initierar vi den som standardvariabler med en variabel adress. Om pekare i C-programmering är oinitierade och används i ett program, kan resultaten bli oförutsägbara och potentiellt katastrofala.
För att få adressen till en variabel använder vi et-tecken (&)-operatorn, placerad före namnet på en variabel vars adress vi behöver. Pekarinitiering görs med följande syntax.
Pekarsyntax
pointer = &variable;
Ett enkelt program för pekareillustration ges nedan:
#include <stdio.h> int main() { int a=10; //variable declaration int *p; //pointer variable declaration p=&a; //store address of variable a in pointer p printf("Address stored in a variable p is:%x\n",p); //accessing the address printf("Value stored in a variable p is:%d\n",*p); //accessing the value return 0; }
Produktion:
Address stored in a variable p is:60ff08 Value stored in a variable p is:10
Operator | Betydelse |
---|---|
* | Tjänar 2 syften
|
& | Tjänar endast 1 syfte
|
Typer av pekare i C
Följande är de olika Typer av pekare i C:
Nollpekare
Vi kan skapa en nollpekare genom att tilldela nollvärde under pekardeklarationen. Den här metoden är användbar när du inte har någon adress tilldelad pekaren. En nollpekare innehåller alltid värdet 0.
Följande program illustrerar användningen av en nollpekare:
#include <stdio.h> int main() { int *p = NULL; //null pointer printf(“The value inside variable p is:\n%x”,p); return 0; }
Produktion:
The value inside variable p is: 0
Void Pointer
In C-programmering, kallas en void-pekare också som en generisk pekare. Den har ingen standarddatatyp. En void-pekare skapas genom att använda nyckelordet void. Den kan användas för att lagra en adress för vilken variabel som helst.
Följande program illustrerar användningen av en void-pekare:
#include <stdio.h> int main() { void *p = NULL; //void pointer printf("The size of pointer is:%d\n",sizeof(p)); return 0; }
Produktion:
The size of pointer is:4
Vild pekare
En pekare sägs vara en vild pekare om den inte initieras till någonting. Dessa typer av C-pekare är inte effektiva eftersom de kan peka på någon okänd minnesplats som kan orsaka problem i vårt program och det kan leda till att programmet kraschar. Man bör alltid vara försiktig när man arbetar med vilda pekare.
Följande program illustrerar användningen av vild pekare:
#include <stdio.h> int main() { int *p; //wild pointer printf("\n%d",*p); return 0; }
Produktion:
timeout: the monitored command dumped core sh: line 1: 95298 Segmentation fault timeout 10s main
Andra typer av pekare i "c" är följande:
- Dinglande pekare
- Komplex pekare
- Nära pekaren
- Långpekare
- Stor pekare
Direkta och indirekta åtkomstpekare
I C finns det två likvärdiga sätt att komma åt och manipulera ett variabelt innehåll
- Direktåtkomst: vi använder variabelnamnet direkt
- Indirekt åtkomst: vi använder en pekare till variabeln
Låt oss förstå detta med hjälp av programmet nedan
#include <stdio.h> /* 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;}
Efter att ha kompilerat programmet utan några fel, är resultatet:
Direct access, var = 1 Indirect access, var = 1 The address of var = 4202496 The address of var = 4202496 Indirect access, var = 48
Pekararitmetik i C
Pekaroperationerna sammanfattas i följande figur
Prioriterad operation (prioritet)
När vi arbetar med C-pekare måste vi följa följande prioriteringsregler:
- Operatörerna * och & har samma prioritet som de unära operatorerna (negationen!, inkrementeringen++, dekrementeringen–).
- I samma uttryck utvärderas de unära operatorerna *, &,!, ++, – från höger till vänster.
Om en P-pekare pekar på en X-variabel kan * P användas överallt där X kan skrivas.
Följande uttryck är likvärdiga:
int X =10 int *P = &Y; For the above code, below expressions are true
Uttryck | Motsvarande uttryck |
---|---|
Y=*P+1
*P=*P+10 *P+=2 ++*P (*P)++ |
Y=X+1
X=X+10 X+=2 ++X X++ |
I det senare fallet behövs parenteser: eftersom de unära operatorerna * och ++ utvärderas från höger till vänster, utan parenteserna skulle pekaren P ökas, inte objektet som P pekar på.
Tabellen nedan visar den aritmetiska och grundläggande operation som kan användas vid hantering av C-pekare
Operation | Förklaring |
---|---|
Uppdrag | int *P1,*P2 Pl=P1; P1 och P2 pekar på samma heltalsvariabel |
Ökning och minskning | Int *P1; P1++;P1–; |
Lägga till en offset (konstant) | Detta gör att pekaren kan flytta N element i en tabell. Pekaren kommer att ökas eller minskas med N gånger antalet byte(s) av typen av variabel. Pl+1; |
C Pointers & Arrays med exempel
Traditionellt kommer vi åt arrayelementen med hjälp av dess index, men denna metod kan elimineras genom att använda pekare. Pekare gör det enkelt att komma åt varje arrayelement.
#include <stdio.h> int main() { int a[5]={1,2,3,4,5}; //array initialization int *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 elements p++; //incrementing to the next element, you can also write p=p+1 } return 0; }
Produktion:
1 2 3 4 5
Om du lägger till ett visst nummer till en pekare flyttas pekarens plats till det värde som erhålls genom en additionsoperation. Anta att p är en pekare som för närvarande pekar på minnesplatsen 0 om vi utför följande additionsoperation, p+1 så kommer den att köras på detta sätt:
Eftersom p för närvarande pekar på platsen 0 efter att ha lagt till 1, kommer värdet att bli 1, och därför kommer pekaren att peka på minnesplatsen 1.
C Pekare och strängar med exempel
En sträng är en array av char-objekt som slutar med ett nolltecken '\ 0'. Vi kan manipulera strängar med hjälp av pekare. Den här pekaren i C-exemplet förklarar detta avsnitt
#include <stdio.h> #include <string.h> 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 pointer for(int i=0;i<strlen(str);i++) { printf("%c\n",*p); p++; } return 0; }
Produktion:
First character is:H Next character is:e Printing all the characters in a string H e l l o G u r u 9 9 !
Ett annat sätt att hantera strängar är med en rad pekare som i följande program:
#include <stdio.h> int 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;}
Produktion:
Please remember these materials: iron copper gold
Fördelar med Pointers i C
- Pekare är användbara för att komma åt minnesplatser.
- Pekare ger ett effektivt sätt att komma åt elementen i en arraystruktur.
- Pekare används för dynamisk minnesallokering såväl som avallokering.
- Pekare används för att bilda komplexa datastrukturer som länkad lista, graf, träd, etc.
Nackdelar med Pointers i C
- Pekare är lite komplicerade att förstå.
- Pekare kan leda till olika fel som segmenteringsfel eller kan komma åt en minnesplats som inte alls krävs.
- Om ett felaktigt värde ges till en pekare kan det orsaka minneskada.
- Pekare är också ansvariga för minnesläckage.
- Pekare är jämförelsevis långsammare än variablernas.
- Programmerare har mycket svårt att arbeta med pekarna; därför är det programmerarens ansvar att manipulera en pekare noggrant.
Sammanfattning
- En pekare är inget annat än en minnesplats där data lagras.
- En pekare används för att komma åt minnesplatsen.
- Det finns olika typer av pekare som en nollpekare, vildpekare, void-pekare och andra typer av pekare.
- Pekare kan användas med array och sträng för att komma åt element mer effektivt.
- Vi kan skapa funktionspekare för att anropa en funktion dynamiskt.
- Aritmetiska operationer kan göras på en pekare som är känd som pekararitmetik.
- Pekare kan också peka på funktion vilket gör det enkelt att anropa olika funktioner i fallet med att definiera en array av pekare.
- När du vill hantera olika typer av variabeldata kan du använda en typcast void-pekare.