Kazalci so ključnega pomena za številne programe C, vendar jih je težko razumeti. Preglejte njihovo sintakso in kako delujejo s praktičnimi primeri.
Kazalci so bistveni vidik programiranja C, ki ga boste morali dobro razumeti, če želite učinkovito uporabljati jezik. Pomagajo pri učinkovitem upravljanju pomnilnika, posredovanju podatkov po sklicu, ravnanju z nizi in nizi ter več. Vendar pa zahtevajo previdno uporabo, da se izognete napakam.
Raziščite podrobnosti o kazalcih C, od razumevanja pomnilnika in naslovov do obvladovanja aritmetike kazalcev.
Pomnilnik in naslovi
Spomin - pogosto se uporablja kot okrajšava za RAM (pomnilnik z naključnim dostopom)— je prostor za shranjevanje v računalniku, ki hrani podatke in navodila, ki jih program potrebuje za delovanje. Služi kot delovni prostor za vaš program. Najmanjša pomnilniška enota je običajno bajt, ki je enak osmim bitom.
Vsaka pomnilniška lokacija ima edinstven naslov in lahko shrani različno količino podatkov, odvisno od računalnika. Ko deklarirate spremenljivko v C, ji implicitno dodelite pomnilniško lokacijo za shranjevanje njenih podatkov. Pomislite na to kot na hišo, ki ima edinstven naslov, ki ga lahko uporabite, da jo poiščete.
Predstavljajte si pomnilnik vašega računalnika kot zaporedje celic za shranjevanje, od katerih vsaka vsebuje bajt podatkov. Recimo, da obstajata dve spremenljivki, x in l, v programu C:
int x = 5;
int y = 10;
V spominu bi lahko izgledalo takole:
Naslov |
podatki |
---|---|
1000 |
5 |
1004 |
10 |
Tukaj ločene pomnilniške lokacije shranjujejo te spremenljivke. Podatki, ki x predstavlja prebiva na pomnilniškem naslovu 1000, medtem ko lpodatki zasedajo pomnilniški naslov 1004.
Razumevanje pomnilnika in naslovov je ključnega pomena, ko delate s kazalci, ker so spremenljivke, ki shranjujejo pomnilniške naslove. Omogočajo vam dostop do podatkov, shranjenih na določeni pomnilniški lokaciji, in njihovo upravljanje.
Deklariranje in inicializacija kazalcev v C
Preden lahko spremenite podatke s kazalci v C, jih morate deklarirati in inicializirati.
Izjava
Če želite deklarirati kazalec, določite tip podatkov, na katerega kaže, sledita mu zvezdica (*) in nato ime kazalca. Na primer:
int *ptr;
tukaj, int *ptr deklarira kazalec z imenom ptr ki lahko shrani pomnilniški naslov celega števila.
Inicializacija
Po deklaraciji ga morate inicializirati s pomnilniškim naslovom, na katerega bo kazal. Inicializirate ga lahko takole:
int x = 5;
int *ptr = &x;
V tej izjavi je & operator pridobi naslov spremenljivke x. Koda v bistvu pravi, da je "ptr spremenljivka, shranjuje pomnilniško lokacijo cele vrednosti in ta lokacija je tam, kjer se x trenutno nanaša."
zdaj, ptr vsebuje naslov celoštevilske spremenljivke x. Na primer:
Spremenljivka |
Naslov |
Vrednost |
---|---|---|
x |
1000 |
5 |
ptr |
1000 |
Kazalci v jeziku C ne shranjujejo le naslova spremenljivke, ampak imajo tudi svoj edinstveni naslov v pomnilniku računalnika.
Dereferenciranje kazalcev
Dereferenciranje kazalca C pomeni dostop do vrednosti, shranjene na pomnilniškem naslovu, na katerega kaže kazalec.
Recimo, da imate kazalec, int *ptr, ki kaže na celoštevilsko spremenljivko in ta spremenljivka ima vrednost 10. Za dostop do vrednosti prek kazalca uporabite zvezdico (*) operater:
int x = 10;
int *ptr = &x; // ptr points to the address of x
int value = *ptr; // Dereferencing ptr to get the value
Ta primer uporablja ptr spremenljivka za pridobitev vrednosti na pomnilniškem naslovu, na katerega kaže. Torej, vrednost zdaj ima vrednost 10, kar je vsebina x.
Aritmetika kazalca
Aritmetika kazalca je zmogljiva funkcija v C, še posebej uporabna za delo z nizi in nizi (ki so nizi znakov). Omogoča vam izvajanje aritmetičnih operacij na kazalcih za premikanje po pomnilniku.
Tukaj je primer, ki prikazuje, kako ga lahko uporabite.
Začnite z deklaracijo niza celih števil:
int numbers[] = {10, 20, 30};
Deklarirajte kazalec na int in mu dodelite pomnilniško lokacijo številske matrike:
int *ptr = numbers;
Tukaj vam ni treba uporabiti operatorja "&", ker so številke že implicitno vrsta kazalca.
Spremenljivka ptr zdaj kaže na prvi element v matriki:
printf("%d\n", *ptr); // 10
Kazalec lahko premaknete na tretji element matrike tako, da ga povečate za 2:
ptr += 2;
printf("%d\n", *ptr); // 30
Kazalec lahko premaknete nazaj tako, da od njega odštejete:
ptr--;
printf("%d\n", *ptr); ;// 20
Aritmetika kazalca je še posebej uporabna za krmarjenje po nizih in delo z dinamičnim dodeljevanjem pomnilnika.
Kazalci in funkcije v C
Če ti razumeti, kako funkcije delujejo v programiranju C, potem ste na dobri poti, da uporabite kazalce funkcij. Tukaj je nekaj načinov, kako jih lahko uporabite.
Kazalci funkcij
Funkcijske kazalce lahko deklarirate in uporabite za dinamično uporabo funkcij, tako kot vse druge vrednosti. To je še posebej uporabno za povratne klice in dinamično izvajanje funkcij.
int (*operation)(int, int); // Declare a function pointer
operation = add; // Pointer to an add function
int result = operation(5, 3); // Call the function through the pointer
Ta koda deklarira funkcijski kazalec z imenom delovanje ki lahko kaže na funkcijo, ki sprejme dve celi števili in vrne eno. Dodeljuje (kazalec) na dodati funkcijo za delovanje. Nato uporabi spremenljivko operacije za posreden klic dodaj (5, 3).
Prehajanje po sklicu
Kazalci vam omogočajo posredovanje argumentov s sklicevanjem na funkcije, kar vam omogoča spreminjanje izvirnih podatkov znotraj funkcije. To je ključnega pomena za funkcije, ki morajo spremeniti vrednost spremenljivke zunaj svojega obsega.
voidmodifyValue(int *x){
*x = 42; // Modifies the value of x in the calling code
}
The modifyValue funkcija spremeni vrednost katerega koli argumenta, ki mu ga posreduje klicna koda, in jo nastavi na 42.
Dinamično dodeljevanje pomnilnika
Funkcije lahko vrnejo kazalce na dinamično dodeljen pomnilnik. To je običajno, ko morate ustvariti in vrniti neomejene podatkovne strukture, kot so polja ali povezani seznami. Boste morali dobro obvladajo pomnilnik skladov in kopic da ga uporabim.
int *createArray(intsize){
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}
Ta koda definira funkcijo, createArray, ki sprejme celo število, velikost, kot vnos. Znotraj funkcije dinamično dodeli pomnilnik za niz celih števil podane velikosti z uporabo malloc. Po inicializaciji matrike vrne kazalec na to novo ustvarjeno matriko.
Pogoste uporabe
Kazalci so bistveni v C iz več razlogov in kaj so razlikovanje C od drugih programskih jezikov, kot je Python. Tukaj je nekaj pogostih uporab:
- Dinamično dodeljevanje pomnilnika
- Manipulacija nizov
- Prehajanje po sklicu
- Podatkovne strukture
- Upravljanje virov
Razumevanje teh običajnih uporab kazalcev lahko izboljša vaše sposobnosti programiranja C. Vadite nekaj od tega, da izboljšate svoje razumevanje kazalcev.
Vadite uporabo kazalcev v programiranju C
Obvladovanje kazalcev v programiranju C je dragocena veščina, ki vam omogoča učinkovito upravljanje pomnilnika, manipuliranje s podatki in izvajanje naprednih operacij. Praksa in spretnost s kazalci bosta močno izboljšala vašo sposobnost ustvarjanja robustnih in z viri učinkovitih programov C.