Pekere gir store muligheter for 'C' -funksjoner, som vi er begrenset til å returnere en verdi. Med pekeparametere kan funksjonene våre nå behandle faktiske data i stedet for en kopi av data.
For å modifisere de faktiske verdiene til variabler, overfører anropsuttalelsen adresser til pekerparametere i en funksjon.
I denne veiledningen vil du lære-
- Funksjoner Pekere Eksempel
- Fungerer med Array Parameters
- Funksjoner som returnerer en matrise
- Funksjonspekere
- Array of Function Pointers
- Funksjoner ved bruk av ugyldige pekere
- Funksjon pekere som argumenter
Funksjoner Pekere Eksempel
For eksempel bytter neste program to verdier på to:
void swap (int *a, int *b);int main() {int m = 25;int n = 100;printf("m is %d, n is %d\n", m, n);swap(&m, &n);printf("m is %d, n is %d\n", m, n);return 0;}void swap (int *a, int *b) {int temp;temp = *a;*a = *b;*b = temp;}}
Produksjon:
m is 25, n is 100m is 100, n is 25
Programmet bytter ut de faktiske variabelverdiene fordi funksjonen får tilgang til dem ved hjelp av pekere. Her vil vi diskutere programprosessen:
- Vi erklærer funksjonen som er ansvarlig for å bytte de to variable verdiene, som tar to heltallspekere som parametere og returnerer en hvilken som helst verdi når den kalles.
- I hovedfunksjonen erklærer og initialiserer vi to heltallvariabler ('m' og 'n'), og vi skriver ut henholdsvis verdiene.
- Vi kaller swap () -funksjonen ved å sende adressen til de to variablene som argumenter ved hjelp av ampersand-symbolet. Etter det skriver vi ut de nye bytteverdiene til variabler.
- Her definerer vi swap () -funksjonens innhold som tar to heltalsvariabeladresser som parametere og erklærer en midlertidig heltalsvariabel som brukes som en tredje lagringsboks for å lagre en av verdivariablene som blir satt til den andre variabelen.
- Lagre innholdet i den første variabelen pekt av 'a' i den midlertidige variabelen.
- Lagre den andre variabelen pekt av b i den første variabelen pekt av en.
- Oppdater den andre variabelen (pekt av b) med verdien av den første variabelen som er lagret i den midlertidige variabelen.
Fungerer med Array Parameters
I C kan vi ikke overføre en matrise etter verdi til en funksjon. Mens et matrisenavn er en peker (adresse), så sender vi bare et matrisenavn til en funksjon som betyr å sende en peker til matrisen.
For eksempel vurderer vi følgende program:
int add_array (int *a, int num_elements);int main() {int Tab[5] = {100, 220, 37, 16, 98};printf("Total summation is %d\n", add_array(Tab, 5));return 0;}int add_array (int *p, int size) {int total = 0;int k;for (k = 0; k < size; k++) {total += p[k]; /* it is equivalent to total +=*p ;p++; */}return (total);}
Produksjon:
Total summation is 471
Her vil vi forklare programkoden med detaljer
- Vi erklærer og definerer add_array () -funksjon som tar en matriseadresse (peker) med elementnummeret som parametere og returnerer den totale akkumulerte summeringen av disse elementene. Pekeren brukes til å gjenta matriseelementene (ved hjelp av p [k] -notasjonen), og vi akkumulerer summeringen i en lokal variabel som vil bli returnert etter at den har iterert hele elementmatrisen.
- Vi erklærer og initialiserer et heltall array med fem heltallelementer. Vi skriver ut den totale summeringen ved å sende matrisenavnet (som fungerer som adresse) og matrisestørrelsen til add_array () kalt funksjon som argumenter.
Funksjoner som returnerer en matrise
I C kan vi returnere en peker til en matrise, som i følgende program:
#includeint * build_array();int main() {int *a;a = build_array(); /* get first 5 even numbers */for (k = 0; k < 5; k++)printf("%d\n", a[k]);return 0;}int * build_array() {static int Tab[5]={1,2,3,4,5};return (Tab);}
Produksjon:
12345
Og her vil vi diskutere programdetaljene
- Vi definerer og erklærer en funksjon som returnerer en matriseadresse som inneholder en heltallverdi og ikke tok noen argumenter.
- Vi erklærer et heltallspeker som mottar hele matrisen som er bygget etter at funksjonen er kalt, og vi skriver ut innholdet ved å itere hele fem-elementmatrisen.
Legg merke til at en peker, ikke en matrise, er definert for å lagre matriseadressen som returneres av funksjonen. Legg også merke til at når en lokal variabel returneres fra en funksjon, må vi erklære den som statisk i funksjonen.
Funksjonspekere
Som vi per definisjon vet at pekere peker på en adresse på et hvilket som helst minneplass, kan de også peke på begynnelsen av den kjørbare koden som funksjoner i minnet.
En peker for å fungere er erklært med *, den generelle uttalelsen om erklæringen er:
return_type (*function_name)(arguments)
Du må huske at parentesene rundt (* funksjonsnavn) er viktige fordi uten dem vil kompilatoren tro at funksjonsnavnet returnerer en peker med retur_type.
Etter å ha definert funksjonspekeren, må vi tilordne den til en funksjon. For eksempel erklærer neste program en vanlig funksjon, definerer en funksjonspeker, tilordner funksjonspekeren til den vanlige funksjonen og ringer deretter funksjonen gjennom pekeren:
#includevoid Hi_function (int times); /* function */int main() {void (*function_ptr)(int); /* function pointer Declaration */function_ptr = Hi_function; /* pointer assignment */function_ptr (3); /* function call */return 0;}void Hi_function (int times) {int k;for (k = 0; k < times; k++) printf("Hi\n");}
Produksjon:
HiHiHi
- Vi definerer og erklærer en standardfunksjon som skriver ut en Hi-tekst k ganger, indikert av parametertiden når funksjonen kalles
- Vi definerer en pekerfunksjon (med sin spesielle erklæring) som tar et heltallsparameter og ikke returnerer noe.
- Vi initialiserer pekerfunksjonen vår med Hi_function, noe som betyr at pekeren peker mot Hi_function ().
- I stedet for at standardfunksjonen ringer ved å tappe funksjonsnavnet med argumenter, kaller vi bare pekerfunksjonen ved å sende nummeret 3 som argumenter, og det er det!
Husk at funksjonsnavnet peker på startadressen til den kjørbare koden som et matrisenavn som peker på det første elementet. Derfor er instruksjoner som function_ptr = & Hi_function og (* funptr) (3) riktige.
MERKNAD: Det er ikke viktig å sette inn adresseoperatøren & og indireksjonsoperatøren * under funksjonstildelingen og funksjonsanropet.
Array of Function Pointers
En rekke funksjonspekere kan spille en bryter eller en if-uttalelsesrolle for å ta en beslutning, som i neste program:
#includeint sum(int num1, int num2);int sub(int num1, int num2);int mult(int num1, int num2);int div(int num1, int num2);int main(){ int x, y, choice, result;int (*ope[4])(int, int);ope[0] = sum;ope[1] = sub;ope[2] = mult;ope[3] = div;printf("Enter two integer numbers: ");scanf("%d%d", &x, &y);printf("Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: ");scanf("%d", &choice);result = ope[choice](x, y);printf("%d", result);return 0;}int sum(int x, int y) {return(x + y);}int sub(int x, int y) {return(x - y);}int mult(int x, int y) {return(x * y);}int div(int x, int y) {if (y != 0) return (x / y); else return 0;}
Enter two integer numbers: 13 48Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: 2624
Her diskuterer vi programdetaljene:
- Vi erklærer og definerer fire funksjoner som tar to heltallargumenter og returnerer en heltalsverdi. Disse funksjonene legger til, trekker fra, multipliserer og deler de to argumentene angående hvilken funksjon som blir kalt av brukeren.
- Vi erklærer 4 heltall for å håndtere henholdsvis operander, operasjonstype og resultat. Vi erklærer også en matrise med fire funksjonspekere. Hver funksjonspeker i matriseelementet tar to heltallsparametre og returnerer en heltallsverdi.
- Vi tilordner og initialiserer hvert matriseelement med funksjonen som allerede er deklarert. For eksempel vil det tredje elementet som er den tredje funksjonspekeren peke på multiplikasjonsoperasjonsfunksjonen.
- Vi søker operander og type operasjon fra brukeren som er skrevet med tastaturet.
- Vi kalte det riktige matriseelementet (funksjonspeker) med argumenter, og vi lagrer resultatet som genereres av den aktuelle funksjonen.
Instruksjonen int (* ope [4]) (int, int); definerer matrisen med funksjonspekere. Hvert array-element må ha samme parametere og returtype.
Uttalelsesresultatet = ope [valg] (x, y); kjører passende funksjon i henhold til brukerens valg De to angitte heltallene er argumentene som sendes til funksjonen.
Funksjoner ved bruk av ugyldige pekere
Ugyldige pekere brukes under funksjonserklæringer. Vi bruker ugyldige * returtypetillatelser for å returnere alle typer. Hvis vi antar at parametrene våre ikke endres når vi går til en funksjon, erklærer vi det som konst.
For eksempel:
void * cube (const void *);
Tenk på følgende program:
#includevoid* cube (const void* num);int main() {int x, cube_int;x = 4;cube_int = cube (&x);printf("%d cubed is %d\n", x, cube_int);return 0;}void* cube (const void *num) {int result;result = (*(int *)num) * (*(int *)num) * (*(int *)num);return result;}
Resultat:
4 cubed is 64
Her vil vi diskutere programdetaljene:
- Vi definerer og erklærer en funksjon som returnerer en heltallverdi og tar en adresse til uforanderlig variabel uten en spesifikk datatype. Vi beregner kubeverdien til innholdsvariabelen (x) pekt av num-pekeren, og da det er en tom peker, må vi skrive kaste den til et heltall datatype ved hjelp av en spesifikk notasjon (* datatype) peker, og vi returnerer kubeverdien.
- Vi erklærer operanden og resultatvariabelen. Vi initialiserer også vår operand med verdien "4."
- Vi kaller kubefunksjonen ved å sende operandadressen, og vi håndterer returverdien i resultatvariabelen
Funksjon pekere som argumenter
En annen måte å utnytte en funksjonspeker ved å sende den som et argument til en annen funksjon, noen ganger kalt "tilbakeringingsfunksjon" fordi mottaksfunksjonen "kaller den tilbake."
I stdlib.h-toppfilen bruker Quicksort "qsort ()" -funksjonen denne teknikken, som er en algoritme dedikert til å sortere en matrise.
void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
- void * base: ugyldig peker til matrisen.
- size_t num: Matrisen element nummer.
- size_t width Elementstørrelsen.
- int (* sammenlign (const void *, const void *): funksjonspeker sammensatt av to argumenter og returnerer 0 når argumentene har samme verdi, <0 når arg1 kommer før arg2, og> 0 når arg1 kommer etter arg2.
Følgende program sorterer et heltall array fra lite til stort tall ved hjelp av funksjonen qsort ():
#include#include int compare (const void *, const void *);int main() {int arr[5] = {52, 14, 50, 48, 13};int num, width, i;num = sizeof(arr)/sizeof(arr[0]);width = sizeof(arr[0]);qsort((void *)arr, num, width, compare);for (i = 0; i < 5; i++)printf("%d ", arr[ i ]);return 0;}int compare (const void *elem1, const void *elem2) {if ((*(int *)elem1) == (*(int *)elem2)) return 0;else if ((*(int *)elem1) < (*(int *)elem2)) return -1;else return 1;}
Resultat:
13 14 48 50 52
Her vil vi diskutere programdetaljene:
- Vi definerer sammenligningsfunksjon sammensatt av to argumenter og returnerer 0 når argumentene har samme verdi, <0 når arg1 kommer før arg2, og> 0 når arg1 kommer etter arg2.Parametrene er en ugyldig pekertype som er kastet til riktig matrixdatatype (heltall)
- Vi definerer og initialiserer et heltallmatrise Matrisestørrelsen lagres i num- variabelen, og størrelsen på hvert matriseelement lagres i bredde-variabelen ved bruk av sizeof () forhåndsdefinert C-operator.
- Vi kaller qsort- funksjonen og sender matrisenavn, størrelse, bredde og sammenligningsfunksjon definert tidligere av brukeren for å sortere matrisen vår i stigende rekkefølge. Sammenligningen vil bli utført ved å ta i hver iterasjon to matriseelementer til hele matrisen vil bli sortert.
- Vi skriver ut matriseelementene for å være sikre på at matrisen vår er godt sortert ved å itere hele matrisen ved hjelp av for loop.