In deze tutorial leer je over aanwijzingen; wat zijn de aanwijzingen, hoe gebruik je ze en de veelgemaakte fouten die je kunt tegenkomen als je ermee werkt aan de hand van voorbeelden.
Pointers zijn krachtige functies van C- en C ++ -programmering. Voordat we aanwijzingen leren, leren we adressen in C-programmering.
Adres in C
Als je een variabele var in je programma hebt, &var
zal je zijn adres in het geheugen krijgen.
We hebben het adres meerdere keren gebruikt tijdens het gebruik van de scanf()
functie.
scanf("%d", &var);
Hier wordt de waarde die door de gebruiker is ingevoerd, opgeslagen in het adres van de variabele var. Laten we een werkend voorbeeld nemen.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Uitvoer
var: 5 adres van var: 2686778
Opmerking: u krijgt waarschijnlijk een ander adres als u de bovenstaande code uitvoert.
C Pointers
Pointers (pointervariabelen) zijn speciale variabelen die worden gebruikt om adressen op te slaan in plaats van waarden.
Pointer-syntaxis
Hier is hoe we aanwijzingen kunnen geven.
int* p;
Hier hebben we een pointer p van het int
type verklaard .
U kunt ook op deze manieren aanwijzingen geven.
int *p1; int * p2;
Laten we nog een voorbeeld nemen van het aangeven van aanwijzingen.
int* p1, p2;
Hier hebben we een pointer p1 en een normale variabele p2 gedeclareerd.
Adressen toewijzen aan Pointers
Laten we een voorbeeld nemen.
int* pc, c; c = 5; pc = &c;
Hier wordt 5 toegewezen aan de variabele c. En het adres van c wordt toegewezen aan de pc-pointer.
Krijg waarde van het ding gewezen door pointers
Om de waarde van het ding door de aanwijzers aangegeven te krijgen, gebruiken we de *
operator. Bijvoorbeeld:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Hier wordt het adres van c
toegewezen aan de pc-pointer. Om de waarde op dat adres te krijgen, gebruikten we * pc.
Opmerking: in het bovenstaande voorbeeld is de pc een aanwijzer, niet *pc
. Je kunt en mag zoiets niet doen *pc = &c
;
Overigens *
wordt dit de dereferentie-operator genoemd (bij het werken met pointers). Het werkt op een aanwijzer en geeft de waarde weer die in die aanwijzer is opgeslagen.
Veranderende waarde aangegeven door pointers
Laten we een voorbeeld nemen.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
We hebben het adres van c toegewezen aan de pc-pointer.
Vervolgens hebben we de waarde van c gewijzigd in 1. Aangezien pc en het adres van c hetzelfde zijn, *pc
krijgen we 1.
Laten we een ander voorbeeld nemen.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
We hebben het adres van c toegewezen aan de pc-pointer.
Daarna zijn we overgestapt *pc
op 1 met *pc = 1;
. Omdat pc en het adres van c hetzelfde zijn, is c gelijk aan 1.
Laten we nog een voorbeeld nemen.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
In eerste instantie wordt het adres van c toegewezen aan de pc-aanwijzer met pc = &c;
. Omdat c is 5, *pc
geeft ons 5.
Vervolgens wordt het adres van d toegewezen aan de pc-aanwijzer met pc = &d;
. Aangezien d -15 is, *pc
geeft dit ons -15.
Voorbeeld: werken met pointers
Laten we een werkend voorbeeld nemen.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Uitvoer
Adres van c: 2686784 Waarde van c: 22 Adres van pointer pc: 2686784 Inhoud van pointer pc: 22 Adres van pointer pc: 2686784 Inhoud van pointer pc: 11 Adres van c: 2686784 Waarde van c: 2
Toelichting op het programma
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
In beide gevallen maken we een aanwijzer p
(niet *p
) en wijzen &c
we deze toe.
Om deze verwarring te voorkomen, kunnen we de verklaring als volgt gebruiken:
int* p = &c;
Nu je weet wat pointers zijn, leer je in de volgende tutorial hoe pointers gerelateerd zijn aan arrays.