Показивачи

Да се подсетимо – променљива је податак у програму који има:

  • своје име које представља адресу меморијске локације на којој се чува вредност тог податка

  • тип податка (int, float, double) који одређује скуп вредности које податак може имати, као и операције које се над тим податком могу вршити.

Овакав приступ подацима, где се на адреси у меморији чува ВРЕДНОСТ податка назива се директно адресирање.

Постоји и индиректно адресирање, код кога се у меморији чува адреса на којој је уписана вредност траженог податка. Индиректно адресирање се у програмском језику C реализује помоћу показивача.

Адреса неког податка у меморији добија се применом оператора & (адресни оператор). Ми смо овај оператор већ користили код наредбе scanf, јер се код ове наредбе наводе адресе на којима ће се уписати унете вредности!

Са друге стране, ако знамо адресу, да бисмо приступили податку, користимо оператор *.

Показивач (енгл. pointer) представља променљиву која чува адресу меморијске локације неког другог податка. Показивачи обично заузимају 2 или 4 бајта. Број бајтова које показивач заузима зависи од могућег опсега адреса на датом рачунару, а не од броја бајтова колико заузимају подаци на које показивач показује.

Основне особине показивача су:

  • показивач може мењати вредност (тј. у различитим деловима програма може показивати на различите меморијске локације)

  • преко њега се може добити вредност променљиве чију адресу чува (на коју показује)

  • преко њега се може мењати вредност променљиве на коју показује

Показивачи могу да имају тип, али и не морају. Показивачи који имају тип, показују на одређени тип променљиве, нпр. целобројну. Показивачи који немају тип показују на било који тип података (код њих се као тип променљиве, односно тип показивача користи службена реч void).

Да би декларисали показивач, морамо ставити знак * испред његовог имена:

tip_na_koji_pokazuje * ime_pokazivača

Напомена: сасвим је небитно да ли се пише ‘tip* pok’, ‘tip *pok’ или ‘tip * pok’ jер компајлер ионако “не види” ове размаке. На програмеру је да усвоји један од ових начина и да њега користи (то касније представља својеврсни “стил” програмера).

Када показивачу додељујемо почетну вредност, онда вршимо његову иницијализацију адресом неког другог објекта користећи адресни оператор &. Сада показивач садржи адресу тог објекта односно показује на њега. Синтакса иницијализације је:

pokazivač = &neki_objekt;

Пример:

#include<stdio.h>
main()
{
int x=1, y=2;
int *ip; /* ip je pokazivac na tip int */
ip=&x; /* ip sada pokazuje na x */
y=*ip; /* y sada ima vrednost 1 */
printf("y=%d\n",y);
*ip=0; /* x sada ima vrednost 0 */
printf("x=%d\n",x);
}

Вредност показивача је адреса у оперативној меморији. Начин приказивања те адресе зависи од остварења језика C на датом рачунару.

Вредност показивача се применом улазно-излазне конверзије пише и чита функцијама printf, односно scanf, применом конверзије %p. Облик приказивања зависи од рачунара.

пример:

#include<stdio.h>
main()
{
int x, *px; /* px je pokazivac na celobrojne podatke */
px=&x; /* adresa promenljive x smesta se u px */
printf("%p\n",px); /* ispisivanje pokazivaca px */
}

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

Кориштено је развојно окружење Code::Blocks, под оперативним систем LINUX (дистрибуција (K)ubuntu). Применом другог развојног окружења или оперативног система, излазни резултат, односно приказ адресе меморијске локације изгледаће другачије!

Advertisements

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

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

WordPress.com лого

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

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

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

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

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

Google+ photo

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

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