Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
29
Добавлен:
20.02.2017
Размер:
21.05 Кб
Скачать

7-дәріс. Тақырыбы: Көрсеткіштер.

Жоспар:

1. Си тіліндегі көрсеткіштер.

Көрсеткіш-айнымалыны баяндау және инициалдау. Көрсеткіштер

дегеніміз мәндері жады адрестері болатын айнымалыларды айтады.

Көрсеткіште нақты мәні бар айнымалының адресі бар болады. Айнымалы

мәнге тікелей сілтенеді, ал көрсеткіш мәнге жанама сілтенеді. Мәнге

көрсеткіш арқылы жанама сілтеме жанама адрестеу деп аталады.

Кез келген айнымалылар сияқты көрсеткіштер де қолданылмас бұрын

баяндалуы қажет.

int *countPtr, count;

операторында int * (бүті санды мәнге көрсеткіш) типті countPtr

айнымалысы баяндалған. Баяндалуда * символы countPtr-ге ғана

таратылады. Бұл символ баяндалатын айнымалы көрсеткіш екенін көрсетеді.

Кез келген типті объектілерге сілтенетін көрсеткіштерді баяндауға болады.

Көрсеткіштер баяндалу кезінде немесе меншіктеу операторының

көмегімен инициалдануы қажет. Көрсеткіш нөлмен, NULL макросымен

немесе адрестің мәнімен инициалдануы мүмкін. NULL мәнді көрсеткіш

ешнәрсеге көрсетпейді. 0 мәнді көрсеткіштің инициалдануы NULL

тұрақтылы көрсеткіштің инициалдануымен бірдей, бірақ NULL-ді қолданған

маңыздырақ. 0 мәні меншіктелгенде, ол сәйкес типті көрсеткішке түрленеді.

0 мәні көрсеткіш-айнымалыға тікелей меншіктелетін жалғыз бүтін сан болып

табылады.

Көрсеткіштерге қолданатын операциялар. Си тілі көрсеткіштерге 5

негізгі операциялар қолданатынуға болады:

1. Меншіктеу. Көрсеткішке адресті меншіктеуге болады. Массивтің атын

немесе адресті анықтайтын (&) операциясын қолданып, әдетте адресті

31

меншіктеуге болады.

2. Мәнді анықтау. Берілген адрес бойынша қайсібір ұяшықта сақталған мәнді

анықтау үшін (*) операциясы қолданылады.

3. Көрсеткіштің адресін анықтау. Көрсеткіш типті айнымалының басқа

айнымалылар сияқты адресі және мәні болады. & операциясы арқылы

көрсеткіштің адресін анықтауға болады.

4. Көрсеткіштерді арттыру. Бұл амал қарапайым қосу операциясы немесе

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

массивтің келесі элементіне өтуге болады.

5. Көрсеткіштердің айырымы. Екі көрсеткіштің айырмасын табуға болады.

Әдетте бұл операция элементтері бір-бірінің арасындағы ара қашықтықты

табу үшін бір массив элементтеріне сілтенетін көрсеткіштер үшін орынды.

Нәтиже массив өлшемін бар болдыратын айнымалының типіндей болады.

Көрсеткіштерге келесі арифметикалық операцияларды қолдануға болады:

++, --, +, +=, -, -= және екі көрсеткіштің айырмасын анықтауға болады.

Мысал ретінде бірінші элементі жадыдағы адресі 3000-ға тең болатын int

v[10] массивін анықтаймыз. Инициалданатын адресі мәні v[0] vPtr

көрсеткіші , яғни vPtr мәні 3000-ға тең, кез келгені келесі операторлардың

бірімен

vPtr = v;

vPtr = &v[0];

Көрсеткішке бүтін санды қосқаннан немесе азайтқаннан оның мәні бұл

санға емес, көрсеткіш сілтенетін объектінің өлшеміне тең санның

көбейтіндісіне көбейеді немесе азаяды.

Байт бойынша объектінің өлшемі объекті типіне байланысты. Мысалы,

vPtr += 2;

операторы 3008 (3000+2*4) нәтижесін береді, егер бүтін сан үшін жадыда 4

байт бөлінсе. Енді vPtr v[0] элементіне сілтенеді.

Егер vPtr v[0] массив элементінің адресіне сәйкес болатын 3016 мәнге

дейін көбейген болса, онда

vPtr -= 4;

операторы vPtr массивтің басына сәйкес болатын 3000 мәнге қайтарар еді.

Көрсеткіш бірге көбейгенде немесе азайғанда инкремент (++) және

декремент (--) операцияларын қолдануға болады. Әрбір келесі операторлар

массивтің келесі элементіне сілтенетін көрсеткіштің мәнін көбейтеді:

++vPtr;

vPtr++;

Кез келген келесі операторлар массивтің алдыңғы элементіне қатынасатын

көрсеткіштің мәнін азайтады:

--vPtr;

vPtr--;

Көрсеткіш-айнымалылар бір-бірінен азайтыла алады. Мысалы, vPtr

мәні 3000-ға тең болса, ал v2Ptr 3008 адресіне ие болса, онда

x = v2Ptr - vPtr;

32

операторының орындалған нәтижесінде х айнымалысына vPtr адресінен

бастап v2Ptr адресіне дейін орналастырылған, берілген жағдайда 2 мәні

болады, массив элементтерінің саны меншіктеледі.

Екі көрсеткіште бірдей типті болса, көрсеткіш келесі көрсеткішке

меншіктеле алады. қарсы жағдайда оң жақтағы көрсеткіш типті меншіктеу

операторын сол жақтағы көрсеткіш типке келтіру операциясын қолдану

керек.

Сілтеме арқылы параметрді беру. Си тілінде сілтеме бойынша

шақыруды ұйымдастыру үшін көрсеткіштер және жанама адрестеу

операциялары қолданылады. Аргументтері өзгеріп отыратын функция

шақырылса, онда бұл жағдайда оған аргумент адресі беріледі. Әдетте бұл

мақсатқа мәні өзгеріп отыратын айнымалыға адресті алу (&) операциясы

қолданылады. Функцияға айнымалының адресі берілгенде оның мәнін

өзгерту үшін жанама адрестеу (*) операциясы қолданылуы мүмкін. Келесі

программада параметрді сілтеме бойынша беруге мысал келтірілген.

#include <stdio.h>

main()

{ int x=5, y=10;

printf(“x=%d y=%d\n”, x, y);

change(&x,&y); /* функцияның адрестерін беру */

printf(“x=%d y=%d\n”, x, y); }

change (int *u, int *v)

{ int temp;

temp=*u; /* u сілтейтін мәнді temp-ке меншіктеу */

*u=*v;

*v=temp; }

Программаның нәтижесі:

x=5 y=10

x=10 y=5

Берілген функция x және yайнымалыларының мәнін өзгертеді. x және

y айнымалылар адресінің функцияларын беру жолы бойынша біз оған оларға

қатынас жасауға мүмкіндік бердік. Көрсеткіштерді және (*) операциясын

қолдану арқылы функция жадының сәйкес ұяшығында орналастырылған

өлшемдерді шығарды және оларды орындарымен ауыстыра алды.