Funkcijos Rodyklės C programuojant su pavyzdžiais

Rodyklės suteikia daug galimybių „C“ funkcijoms, kurias mes galime apriboti, kad grąžintume vieną vertę. Naudodami žymeklio parametrus, mūsų funkcijos dabar gali apdoroti faktinius duomenis, o ne duomenų kopijas.

Norint modifikuoti faktines kintamųjų reikšmes, iškviečiamasis sakinys perduoda adresus funkcijos rodyklės parametrams.

Šioje pamokoje sužinosite

  • Funkcijų rodyklių pavyzdys
  • Funkcijos su masyvo parametrais
  • Funkcijos, kurios grąžina masyvą
  • Funkcijų rodyklės
  • Funkcijų rodyklių masyvas
  • Funkcijos naudojant tuščius rodykles
  • Funkcijos rodyklės kaip argumentai

Funkcijų rodyklių pavyzdys

Pvz., Kita programa keičia dvi reikšmes iš dviejų:

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;}}

Išvestis:

m is 25, n is 100m is 100, n is 25

Programa keičia faktines kintamųjų reikšmes, nes funkcija prie jų pasiekia adresą naudodama rodykles. Čia aptarsime programos procesą:

  1. Mes skelbiame funkciją, atsakingą už dviejų kintamųjų reikšmių keitimą, kuri parenka parametrus dviem sveikojo skaičiaus rodyklėms ir grąžina bet kurią reikšmę, kai ji iškviečiama.
  2. Pagrindinėje funkcijoje deklaruojame ir inicializuojame du sveikųjų skaičių kintamuosius („m“ ir „n“), tada atitinkamai atspausdiname jų reikšmes.
  3. Mes vadiname funkciją swap (), duodami dviejų kintamųjų adresą kaip argumentus naudodami ampersando simbolį. Po to atspausdiname naujas keičiamas kintamųjų reikšmes.
  4. Čia mes apibrėžiame „swap“) funkcijos turinį, kurio parametrais laikomi du sveikojo skaičiaus kintamųjų adresai, ir paskelbiame laikiną sveiko skaičiaus kintamąjį, naudojamą kaip trečiąjį saugyklos langelį, kad išsaugotumėte vieną iš vertės kintamųjų, kurie bus įtraukti į antrąjį kintamąjį.
  5. Pirmojo kintamojo, pažymėto „a“, turinį laikinajame kintamajame išsaugokite.
  6. Antrąjį kintamąjį, pažymėtą b, laikykite pirmajame kintamajame, pažymėtame a.
  7. Atnaujinkite antrąjį kintamąjį (pažymėtą b) pagal pirmojo kintamojo, išsaugoto laikinajame kintamajame, vertę.

Funkcijos su masyvo parametrais

C atveju negalime perduoti masyvo pagal reikšmę funkcijai. Masyvo pavadinimas yra žymeklis (adresas), todėl mes tiesiog perduodame masyvo pavadinimą funkcijai, o tai reiškia perduoti rodyklę masyvui.

Pavyzdžiui, mes svarstome šią 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);}

Išvestis:

 Total summation is 471

Čia paaiškinsime programos kodą su jo detalėmis

  1. Deklaruojame ir apibrėžiame funkciją add_array (), kuri kaip parametrus ima masyvo adresą (rodyklę) su elementų skaičiumi ir pateikia bendrą sukauptą šių elementų sumą. Rodyklė naudojama masyvo elementams pakartoti (naudojant p [k] žymėjimą), o mes susumuojame vietinį kintamąjį, kuris bus grąžintas pakartojus visą elementų masyvą.
  2. Deklaruojame ir inicijuojame sveikojo skaičiaus masyvą su penkiais sveiko skaičiaus elementais. Mes atspausdiname bendrą sumą, perduodami masyvo pavadinimą (kuris veikia kaip adresas) ir masyvo dydį funkcijai add_array (), kuri vadinama argumentais.

Funkcijos, kurios grąžina masyvą

C, mes galime grąžinti rodyklę į masyvą, kaip šioje programoje:

#include int * 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);}

Išvestis:

12345

Ir čia aptarsime programos detales

  1. Apibrėžiame ir deklaruojame funkciją, kuri pateikia masyvo adresą, kuriame yra sveikojo skaičiaus reikšmė, ir nepateikė jokių argumentų.
  2. Deklaruojame sveiko skaičiaus rodyklę, kuri gauna visą masyvą, sukurtą iškvietus funkciją, ir atspausdiname jo turinį kartodami visą penkių elementų masyvą.

Atkreipkite dėmesį, kad žymeklis, o ne masyvas yra apibrėžtas saugoti masyvo adresą, kurį grąžina funkcija. Taip pat atkreipkite dėmesį, kad kai vietinis kintamasis grąžinamas iš funkcijos, turime jį deklaruoti kaip statinį.

Funkcijų rodyklės

Pagal apibrėžimą žinome, kad žymekliai nurodo adresą bet kurioje atminties vietoje, jie taip pat gali nurodyti vykdomojo kodo pradžioje kaip funkcijas atmintyje.

Veiksmo žymeklis yra deklaruojamas kartu su *, bendras jo deklaracijos teiginys yra:

return_type (*function_name)(arguments)

Turite atsiminti, kad skliausteliai aplink (* function_name) yra svarbūs, nes be jų kompiliatorius manys, kad function_name grąžina return_type rodyklę.

Apibrėžę funkcijos rodyklę, turime ją priskirti funkcijai. Pavyzdžiui, kita programa deklaruoja įprastą funkciją, apibrėžia funkcijos rodyklę, priskiria funkcijos rodyklę įprastai funkcijai ir po to iškviečia funkciją per rodyklę:

#include void 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");} 

Išvestis:

HiHiHi

  1. Apibrėžiame ir paskelbiame standartinę funkciją, kuri išspausdina Hi tekstą k kartus, nurodytus parametro kartus, kai iškviečiama funkcija
  2. Apibrėžiame rodyklės funkciją (su specialia deklaracija), kuri ima sveiko skaičiaus parametrą ir nieko negrąžina.
  3. Inicijuojame žymeklio funkciją naudodami „Hi_function“, o tai reiškia, kad rodyklė rodo į „Hi_function“ ().
  4. Užuot iškvietę standartinę funkciją, užrašydami funkcijos pavadinimą argumentais, mes vadiname tik rodyklės funkciją, argumentais perduodami skaičių 3, ir viskas!

Atminkite, kad funkcijos pavadinimas nurodo vykdomojo kodo pradžios adresą kaip masyvo pavadinimas, nurodantis jo pirmąjį elementą. Todėl tokios instrukcijos kaip function_ptr = & Hi_function ir (* funptr) (3) yra teisingos.

PASTABA: funkcijos priskyrimo ir funkcijos iškvietimo metu nėra svarbu įterpti adreso operatorių ir indirection operatorių *.

Funkcijų rodyklių masyvas

Funkcijų rodyklių masyvas gali atlikti jungiklį arba „if“ teiginį, kad priimtų sprendimą, kaip kitoje programoje:

#include int 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

Čia aptarsime išsamią programos informaciją:

  1. Deklaruojame ir apibrėžiame keturias funkcijas, kurios užima du sveiko skaičiaus argumentus ir grąžina sveiko skaičiaus vertę. Šios funkcijos susieja, atima, padaugina ir padalija du argumentus dėl to, kurią funkciją vartotojas iškviečia.
  2. Mes skelbiame 4 sveikuosius skaičius, atitinkančius operandus, operacijos tipą ir rezultatą. Taip pat deklaruojame keturių funkcijų rodyklių masyvą. Kiekvienas masyvo elemento funkcijos rodyklė užima du sveikųjų skaičių parametrus ir grąžina sveiko skaičiaus vertę.
  3. Kiekvieną masyvo elementą priskiriame ir inicijuojame jau deklaruota funkcija. Pavyzdžiui, trečiasis elementas, kuris yra trečiasis funkcijos rodyklė, nurodys daugybos operacijos funkciją.
  4. Operandų ir operacijos tipo ieškome iš vartotojo, įvesto klaviatūra.
  5. Mes iškvietėme atitinkamą masyvo elementą (Function pointer) su argumentais ir saugome atitinkamos funkcijos sugeneruotą rezultatą.

Nurodymas int (* ope [4]) (int, int); apibrėžia funkcijų rodyklių masyvą. Kiekvienas masyvo elementas turi turėti tuos pačius parametrus ir grąžinimo tipą.

Teiginio rezultatas = ope [pasirinkimas] (x, y); vykdo atitinkamą funkciją pagal vartotojo pasirinkimą. Du įvesti skaičiai yra funkcijos perduoti argumentai.

Funkcijos naudojant tuščius rodykles

Tuštumos žymekliai naudojami deklaruojant funkcijas. Bet kokio tipo grąžinimui naudojame „void * return“ tipo leidimus. Jei manysime, kad perduodami funkcijai mūsų parametrai nesikeičia, mes ją paskelbiame konst.

Pavyzdžiui:

 void * cube (const void *); 

Apsvarstykite šią programą:

#include void* 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;}

Rezultatas:

 4 cubed is 64 

Čia aptarsime išsamią programos informaciją:

  1. Apibrėžiame ir deklaruojame funkciją, kuri pateikia sveiko skaičiaus vertę ir užima nepakeičiamo kintamojo adresą be konkretaus duomenų tipo. Apskaičiuojame turinio kintamojo (x) kubo vertę, nurodytą skaičių žymekliu, ir kadangi tai yra tuštuma rodyklė, mes turime įvesti ją į sveiko skaičiaus duomenų tipą, naudodami konkretų žymėjimo (* duomenų tipas) žymeklį, ir mes grįšime kubo vertė.
  2. Mes skelbiame operandą ir rezultatą kintamuoju. Be to, mes inicijuojame savo operandą reikšme „4.“
  3. Mes iškviečiame kubo funkciją, praleidę operando adresą, ir mes apdorojame grįžtamąją vertę rezultato kintamajame

Funkcijos rodyklės kaip argumentai

Kitas būdas išnaudoti funkcijų žymeklį perduodant jį kaip argumentą kitai funkcijai, kartais vadinamai „atgalinio skambinimo funkcija“, nes priimančioji funkcija „ją iškviečia“.

„Stdlib.h“ antraštės faile „Quicksort“ „qsort ()“ funkcija naudoja šią techniką, kuri yra algoritmas, skirtas masyvui rūšiuoti.

void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
  • void * base: negaliojantis rodyklė į masyvą.
  • size_t num: masyvo elemento numeris.
  • dydis_t plotis Elemento dydis.
  • int (* palyginti (const void *, const void *): funkcijos rodyklė, sudaryta iš dviejų argumentų ir pateikia 0, kai argumentai turi tą pačią vertę, <0, kai arg1 yra prieš arg2, ir> 0, kai arg1 yra po arg2.

Ši programa surūšiuoja sveikųjų skaičių masyvą nuo mažo iki didelio skaičiaus, naudodama qsort () funkciją:

#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;}

Rezultatas:

 13 14 48 50 52 

Čia aptarsime išsamią programos informaciją:

  1. Apibrėžiame palyginimo funkciją, susidedančią iš dviejų argumentų, ir grąžina 0, kai argumentai turi tą pačią vertę, <0, kai arg1 yra prieš arg2, ir> 0, kai arg1 ateina po arg2. Parametrai yra tuščių rodyklių tipas, perduotas tinkamam masyvo duomenų tipui (sveikas skaičius)
  2. Apibrėžiame ir inicijuojame sveiko skaičiaus masyvą Masyvo dydis saugomas kintamajame num, o kiekvieno masyvo elemento dydis - pločio kintamajame, naudojant iš anksto nustatytą operatorių sizeof ().
  3. Mes kviečiame funkciją „ qsort“ ir perduodame anksčiau naudotojo nustatytą masyvo pavadinimą, dydį, plotį ir palyginimo funkciją, kad surikiuotume masyvą didėjimo tvarka. Palyginimas bus atliekamas kiekvienoje iteracijoje paimant du masyvo elementus iki viso masyvo bus rūšiuojami.
  4. Mes atspausdiname masyvo elementus, kad būtume tikri, jog mūsų masyvas yra gerai surūšiuotas kartojant visą masyvą, naudojant ciklą.

Įdomios straipsniai...