Лекция: 30 саѓат Лаборатория: 15 саѓат С¤Ж: 45 саѓат обс¤Ж: 45 саѓат Барлыќ саѓат саны: 135 саѓат


Лекция 24. Тақырыбы: Көрсеткіштерге қолданылатын амалдар



бет17/24
Дата14.06.2016
өлшемі1.16 Mb.
#135127
түріЛекция
1   ...   13   14   15   16   17   18   19   20   ...   24

Лекция 24.

Тақырыбы: Көрсеткіштерге қолданылатын амалдар


(1 сағат)
1. Меншіктеу, қосу, алу амалдары

2. Бүтін санды айыру, салыстыру амалдары, sizeof функциясы



Пайдаланылатын әдебиеттер:

а) негізгі

а) негізгі

1. К.Паппас, У.Мюррей “Программирование на С и С++”, Киев, 2000

2. А.Кетков, Ю.Кетков “Практика программирования Бейсик,

Си, Паскаль”, М.: 2001



б) қосымша

3. Шилдт Г. “Теория и практика С++”, Санкт-Петербург, 1996

4. Березин Б.И., Березин С.Б. “Начальный курс С и С++”, М.:1999
1. Меншіктеу, қосу, алу амалдары

С\С++ тілі көрсеткіштерге түрлі амалдар қолданға мүмкіндік береді.


Меншіктеу амалы:

int *pDat, *pDO, Date = 2003, DateOld=1997;

pDat = &Date; pDO = &DateOld; //айнымалы адресі

pDat = pDO; // көрсеткіш

pDO = NULL; // арнайы мәндер
Қосу және азайту амалдарын қарастырайық.
Мысал.

//Бұл программада С++ тілінде көрсеткіштерге қолданылатын

//амалдар келтірілген

//

# include



void main()

{

int *pi;



float *pf;

int an;


float ar;

pi=&an;


pf=&ar;

pi++;


pf++;

}
Айталық берілген жүйеде бүтін сандар үшін 2 байт, ал жылжымалы үтірмен жазылатын сандар үшін 4 байт ажыратылсын. аn айнымалысы 2000 номерлі ұяшық адресінде сақталынсын, ал ar айнымалысы 4000 ұяшық адресінде сақталынсын делік. Соңғы 2 қатар өрнек орындалған соң рі көрсеткішінің мәні-2002-ге, pf-4004-ке тең болады. ++ амалы айнымалының мәнін 1-ге ғана арттыратынын білетінбіз. Көрсеткіштерге қолданған кезде ++ амалы көрсеткіштің мәнін көрсеткішке ажыратылған жады ұяшығының көлеміне тең санға арттырады. Рі көрсеткіші бүтін типті болғандықтан 2-ге арттырылады, ал pf –нақты (float) тип болғандықтан 4-ке арттырылды. Көрсеткішке кез-келген бүтін санды, не бүтін типті айнымалыны қосып не азайтуға болады.



  1. pf=pf+4;




  1. #include

voi main()

{

float fv[]={15.38, 12.34, 91.88, 11.11, 22.22};



float *pf;

size_t fwidth;

pf=pf+fwidth;

cout<<*pf;

}
Айталық, fv айнымалысының адресі FFCA –ға тең болсын. Fwidth айнымалысы sizeof (float) операторынан өзінің мәнін қабылдайды. (біздің жағдайда -4) 7-ші қатар орындалған соң қандай өзгеріс болады? pf көрсеткішіндегі адрес FFCE-ге өзгереді деп күтуіміз мүмкін алайда FFDA-ға өзгереді. Өйткені біздің жағдайымызда float типті айнымалылардың көлемі 4х4. Нәтижеде pf көрсеткіші массивтің 4 ұяшығына жылжиды (яғни 22,22).

Мысалдар :

int x[4]= {0,2,4,6}, *p, n;

p = &x[0]; /* i x массивтың бірінші элементі адресіне тең -

&x[0] */

n = *p; /* n = 0, p = &x[0] */

n = *p++; /* n = 0, p = &x[1] */

n = ++*p; /* n = 3, p = &x[1] */

n = *++p; /* n = 4, p = &x[2] */

n = (*p)++; /* n = 4, p = &x[2], x[2]=5 */

n = ++(*p); /* n = 6, p = &x[2], x[2]=6 */
2. Бүтін санды айыру, салыстыру амалдары, sizeof функциясы

Көрсеткіштерге тағы да мынадай амалдар қолдануға болады:



  • Көрсеткіштен бүтін мәнді алып тастау

  • Бір көрсеткіштен екінші көрсеткішті алу

  • Көрсеткіштерді мына операторлар арқылы салыстыру: <=, = >=

Көрсеткіштен бүтін санды алу нәтижесінде көрсеткіш мәні осы ұяшықққа қатысты көрсетілген бүтін санды шамаға сәйкес сол жағындағы ұяшықтың адресіне тең болады.

Бір көрсеткіштен екінші көрсеткішті алу амалын қолдану үшін екеуі де бір массивке тиісті болу керек. Бұл амалдың нәтижесі 2 көрсеткіш көрсетіп тұрған ұяшықтарды арасындағы ұяшықтар санына тең болады.

Бір типтегі көрсеткішті екінші типтегі көрсеткішпен салыстыруға болады. Қайтарылатын мән true(!0) не false(0) болуы мүмкін, және бұл мәнді int типті айнымалыға меншіктеуге болады. Бір көрсеткіш екінші көрсеткіштен индексі кіші болған ұяшыққа көрсетіп тұрған болса онда бұл көрсеткіш екінші көрсеткіштен кіші деп есептелінеді. Көрсеткіштерді 0-мен де салыстыруға болады. Көрсеткіш мәні 0-ге тең болуы бұл оның ешбір объектпен байланыспағанын көрсетеді.

Көрсеткіштерге қолданылған sizeof(<мәлімет тип>) функциясының нәтижесі типтерге байланысты мынадай болады: char үшін- 1, short үшін - 2, long үшін - 4 және сол сияқты.
Жалпы жағдайда көрсеткіштің аттары, адресі және мәндері арасындағы арақатынасты мынадай көрсетуге болады:

А көрсеткіші

&A –

көрсеткіш адресі

Лекция 25.

Тақырыбы: Функцияларға көрсеткіш


(1 сағат)
1. Функцияларға көрсеткіш

2. Функцияларға көрсеткіштерге мысалдар қарастыру


Пайдаланылатын әдебиеттер:

а) негізгі

1. К.Паппас, У.Мюррей “Программирование на С и С++”, Киев, 2000

2. А.Кетков, Ю.Кетков “Практика программирования Бейсик,

Си, Паскаль”, М.: 2001



б) қосымша

3. Шилдт Г. “Теория и практика С++”, Санкт-Петербург, 1996

4. Березин Б.И., Березин С.Б. “Начальный курс С и С++”, М.:1999
1. Функцияларға көрсеткіш

Бұған дейінгі мысалдарда көрсеткіштер компьютер жадында орналасқан белгілі бір мәндерді пайдалану үшін қолданылды. Енді берілгендермен емес, программалық кодтар – функциялармен байланысатын көрсеткіштерді қарастырамыз. Берілгендерге көрсеткіш жады ұшықтарын жанама пайдалануға мүмкіндік бергені сияқы функцияға көрсеткіште функцияларды жанама шақыруға мүмкіндік береді. Функцияға көрсеткіш арқылы көптеген маңызды мәселелерді шешуге болады. Мысалы, qsort() деп аталған массивті реттейтін (сортировка жасайтын) функцияны қарастырайық. Функцияға аргумент ретінде қажеттілік мынаған байланысы туындайды: салыстыру алгоритмі күрделі әрі көпфакторлы болып, элемент типтеріне тәуелді әртүрлә орындалуы мүмкін. Бір функцияның коды екіншісіне рагумент ретінде беріле алмайды, бірақ С/С++ -те көрсеткіш көмегімен функцияны жанама пайдалануға болады.

Төменде келтірілген мысалда өзіміздің салыстыру функциямызды icomp_func() құрамыз және осы функцияға көрсеткішті qsort() функциясына береміз.
# include

# include

# define iMAXVAL 10

int icomp_func (const void* ires_a, cost void* ires_b);

int (*ifunc)(const void*, const void*);
void main()

{

int i;



int iarray[iMAXVAL]={0,5,3,2,8,7,9,1,4,6};

ifunc=icomp_func;

qsort(iarray, iMAXVAL, sizeof(int), ifunc);

for(i=0; i

printf(“%d”, iarray[i]);

}
int icomp_func(const void *ires_a, const void *ires_b)

{

return((*(int*) ires_a)-(*(int*) ires_b));



}
icomp_func() функциясы (адрестелетін деп атайтын боламыз) qsort() функциясы (шақырушы деп атайтын боламыз) қоятын талаптарға сәйкес келеді: void* типті 2 аргумент қабылдап, бүтінсанды мән қайтарады. Аргумент қатарындағы const кілттік сөзі аргумент көрсетіп тұрған берілгендерді өзгертуге тиым салады. Мұның арқасында шақырушы функция ең құрығанда берілгендерді дұрыс сортамауы мүмкін, бірақ берілгендері өзгерте алмайды.

Енді icomp_func() функциясының синтаксисін түсініп алған соң, денесіне көңіл аударалық. Егер адрестелетін функция теріс сан қайтарса, онда оның бірінші аргументі екіншісінен кіші. 0-аргументтер тең екендігін, ал оң сан – бірінші аргумент екіншісінен үлкен екендігін көрсетеді. Бұл есептеулер icomp_func() функциясының денесін құрайтын бірғана қатармен жүзеге асырылады.

return((*(int*) ires_a)-(*(int*) ires_b));
Екі көрсеткіште функцияға void* ретінде берілгендікен, олар сәйкесінше int типке келтіріледі және ашылады (*)(раскрываются).

Бірінші көрсеткіштің мәнінен екінші көрсеткіштің мәнін айыру нәтижесі qsort() функциясына сорттау (сортировка) критерийі реінде қайтарылады.

Программаның маңызды бөлігі – адрестелетін функцияға көрсеткіштің сипаттамасы оның прототипінен соң орналасқан.
int (*ifunc)(const void*, const void*);
Бұл өрнек екі void* типті аргумент қабылдап, int типті мән қайтаратын қайсыбір фунцияға ifunc көрсеткішін анықтайды. Көрстекіш атауының айналасындағы жақшалардың маңызы бар. Мына түрдегі өрнек:

int *ifunc(const void*, const void*);


көрсеткіштің сипаттамасы ретінде емес функция прототипі ретінде қабылданады.

qsort функциясы мына параметрлерді қабылдап алады: сортталуы тиіс массивтің адресі (iarray массиві), массив элементінің саны (iMAXVAL константасы), таблица элементінің байттық өлшемі (sizeof(int)) және салыстыру функциясына көрсеткіш (ifunc()).


2. Функцияларға көрсеткіштерге мысалдар қарастыру

Тағы да бірнеше мысалдар қарастыралық:

1. int *(*(*ifunc)(int))[5];

2. float (*(*ffunc)(int,int))(float);

3. typedef double(*(*(*dfunc)())[5])();

dfunc a_dfunc;

4. (*(*function_array())[5])();
– бір бүінсанды аргументті қабылдап, элементі int типті 5 көрсеткіштен тұратын массивке көрстекішін қайтаратын функцияға ifunc көрсеткішін сипатайды.

– 2 бүтінсанды аргументті қабылдап және float типті бір аргументті қабылдайтын және нәтижесі осы типте болатын функцияға көрсеткішін қайтаратын функцияға ffunc көрсеткішін сипаттайды.

– typedef кілттік сөзі арқылы берілгендердің жаңа типін құруға болады. Бұл қатар былайша оқылады: dfunc типі аргумент қабылдамайтын, 5 көрсеткіштен тұратын массивтің көрсеткішін қайтаратын функцияға көрсеткіш ретінде анықталған. 5 көрсеткіш өз кезегінде аргменті жоқ, double типті мән қайтаратын функцияларға көрсеткіш болып табылады. Келесі қатарда осы типтегі көрсеткіш құрылады.

– функция сипатталады. Құрылатын function_array() функциясының параметрлері жоқ және бес көрсеткіштен тұратын (олар аргументі жоқ, int типті мән қайтаратын функцияға нұсқайды. Егер типі көрсетілмесе онда int деп қабылданады)





Достарыңызбен бөлісу:
1   ...   13   14   15   16   17   18   19   20   ...   24




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет