Неколико примера који илуструју основне операције са показивачима

пример: Програм који приказује вредност показивача и променљиве на коју тај показивач показује

#include <stdio.h>
main()
{
     int broj=5;int *pokBroj=&broj; /* pokazivacu pokBroj dodelili smo adresu promenljive broj, tj. kao vrednost pokazivaca pokBroj upisana je adresa promenljive broj! */

printf("Vrednost promenljive broj je %d\n",broj);
printf("Adresa promenljive broj je %p\n",&broj);
     printf("Adresa pokazivaca pokBroj je %p\n",pokBroj); /* ovo je, u stvari, vrednost upisan u pokazivac pokBroj, a to je adresa promenljive broj! */
}

резултат извршавања:

Оно што је важно запамтити то је да је показивач адреса, тј. вредност показивача је адреса! У нашем примеру pokBroj је адреса податка broj, a *pokBroj је вредност податка broj.

Ако желимо да добијемо вредност променљиве на коју показивач показује, испред имена показивача мора се навести ‘*’. Знак * се зове оператор дереференцирања или индирекције.

#include <stdio.h>
main()
{
int broj=5;int *pokBroj=&broj;
printf("Vrednost promenljive broj je %d\n",broj);
printf("Adresa promenljive broj je %p\n",&broj);

printf("Adresa pokazivaca pokBroj je %p\n",pokBroj); /* koristi se samo ime pokazivaca, prikazuje se adresa */
printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj); /* koristi se "vrednost" pokazivaca, odnosno izvrseno je dereferenciranje pokazivaca pa se prikazuje vrednost promenljive */
}

резултат извршавања овог програма:

Сада, када је показивач добио адресу на коју показује, над њим је могуће обављати радње попут инкрементирања (повећавање вредности за 1), декрементирања (смањивање вредности за 1), те рачунске операције. Али, ако не користимо знак дереференцирања => не мењамо вредност променљиве него адресу, па можемо добити чудне резултате!

#include <stdio.h>
main()
{
int broj=5;int *pokBroj=&broj;
printf("Vrednost promenljive broj je %d\n",broj);
printf("Adresa promenljive broj je %p\n",&broj);

printf("Adresa pokazivaca pokBroj je %p\n",pokBroj);
printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj);
printf("\n\n");
     pokBroj++;/* namera je bila da povecamo vrednost upisanu u memorijsku lokaciju pokBroj, tako da se vrednost promenljive broj poveca za 1 */
printf("Adresa pokazivaca pokBroj je %p\n",pokBroj); /* ovo je, u stvari, adresa na koju je smesten pokazivac */
printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj);/* promenjena je vrednost pokazivaca, odnosno u adresu pokBroj je upisana nova adresa, a na toj adresi se nalazi nesto sto nismo ocekivali*/
     pokBroj+=2;
     printf("Adresa pokazivaca pokBroj je %p\n",pokBroj);/* adresa pokazivaca ostaje nepromenjena*/
     printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj);/*ponovo neocekivan rezultat, hteli smo izvrsiti operaciju broj=broj+2, pomocu pokazivaca pokBroj, ali smo mi umesto toga promenili vrednost koja je upisana na adresi pokBroj, a na toj adresi na koju pokBroj pokazuje ne nalazi se ono sto smo mi ocekivali*/
}

резултат:

Претходни програм требало је написати на следећи начин:

#include <stdio.h>
main()
{
int broj=5;int *pokBroj=&broj;
printf("Vrednost promenljive broj je %d\n",broj);
printf("Adresa promenljive broj je %p\n",&broj);

printf("Adresa pokazivaca pokBroj je %p\n",pokBroj);
printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj);
printf("\n\n");
     (*pokBroj)++;
printf("Adresa pokazivaca pokBroj je %p\n",pokBroj);
printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj);
     (*pokBroj)+=2;
     printf("Adresa pokazivaca pokBroj je %p\n",pokBroj);
     printf("Vrednost pokazivaca pokBroj je %d\n",*pokBroj);
}

и резултат извршавања показује да смо добили баш оно што смо хтели:

Још једна важна напомена: показивачи су ограничени типом на који показују. Ако, на пример, одредите да показивач показује на целобројну вредност, не можете му придружити адресу реалне променљиве. Изузетак од овога правила чине показивачи типа void * који показују на неки неодређени тип податка тако да они могу показивати на било који тип података. Али, показивачи типа void * не могу бити иницијализовани, дакле не може им се доделити почетна вредност!

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s