Көрсеткіштер массиві



Кіріспе
• Көрсеткіштер массиві. Көпөлшемді массивтер.
• Көрсеткіштер массив инициализациясы. Көпөлшемді массивтердің орнындағы көрсеткіштер.

Негізгі бөлім
• Құрылымдар мен функциялар.
• Құрылым массивтері.

Қорытынды
• Әдебиеттер
Си-де функциялар өзінің аргументтері ретінде параметрлер мәнін қабылдайтын болғандықтан, тікелей мүмкіншілік шақырылатын функцияда айнымалыны өзгертуге болмайды.
Қажетті нәтижені алу үшін, шақырылатын программада өзгертілуі тиісті мәнге көрсеткіштерді беру қажет. Бұл жағдайда шақырылатын функция формальды параметрлердің көрсеткіштер ретінде сипатталуы қажет, бұдан параметрлердің мәніне қатынасу олар арқылы жанама түрде жүргізіледі. Формальды параметрлер – шақырылатын функцияда оның программасын шақыратын объектіге қатынасуды жүзеге асыратын көрсеткіштер және осы объектілерді өзгертуге мүмкіндік береді.
Программада сұрыптауды екі реттелмеген элементтердің орнын ауыстыратын swap функциясы арқылы орындалатынын қарастырайық.
Егер swap функциясы келесі түрде анықталса:
void swap (int x, int y)
{ int temp;
temp=x; x=y; y=temp;
}
онда swap(a,b)-ны шақыру a мен b айнымалыларына ешқандай әсер етпейді, swap олардың мәндерінің көшірмесін ғана алады. Нәтижеге жету үшін алмастырулар, swap функциясының формальды параметрлері көрсеткіш ретінде сипатталуы керек, ал функцияны шақырудағы аргументтер , swap (&a, &b)-ның сәйкес параметрлерінің адрестерімен көрсетілуі тиіс..
void swap (int *px, int *py)
{int temp;
temp=*px; *px=*py; *py=temp;
}
Си-де көрсеткіштер мен массивтердің арасында байланыс бар, байланыс өте тығыз болғандығы соншалықты, бұл құралдарды бірге қарастырған дұрыс. Индекстеу операциясынан басқа массивтің элементтеріне қатынасу көрсеткіштерінің көмегімен орындалуы мүмкін және мұндай вариант жылдамырақ жұмыс жасайды.
1 Подбельский В.В., Фомин С.С. Программирование на языке Си:
Учеб. пособие. – 2- е доп. изд. – М.: Финансы и статистика, 2002
1 Подбельский В.В. Язык С ++: Учеб. пособие. – 3- е изд. Дораб . - М.: Финансы и статистика, 1998
2 Культин Н.Б. С/ С++ в задачах и примерах. – СПб.: БХВ – Петербург, 2004
3 Мартынов Н.Н. Программирование для Windows на С/ С++. Том.1.- М.: ООО “ Бином – Пресс”, 2004
4 Шиманович Е.А. С/ С++ в примерах и задачах. – Мн. : Новое знание, 2004
5 Ахо А.В., Хопкрофт Д.Э., Ульман Д.Д. - Структуры данных и алгоритмы, Издательство “Вильямс”, Москва, 2000
6 Седжвик Р. Фундаментальные алгоритмы на С++. Части 1-4, Издательство “ДиаСофт”, Москва, 2001

Кіріспе

Си-де функциялар өзінің аргументтері ретінде параметрлер мәнін
қабылдайтын болғандықтан, тікелей мүмкіншілік шақырылатын функцияда
айнымалыны өзгертуге болмайды.
Қажетті нәтижені алу үшін, шақырылатын программада өзгертілуі тиісті
мәнге көрсеткіштерді беру қажет. Бұл жағдайда шақырылатын функция формальды
параметрлердің көрсеткіштер ретінде сипатталуы қажет, бұдан параметрлердің
мәніне қатынасу олар арқылы жанама түрде жүргізіледі. Формальды параметрлер
– шақырылатын функцияда оның программасын шақыратын объектіге қатынасуды
жүзеге асыратын көрсеткіштер және осы объектілерді өзгертуге мүмкіндік
береді.
Программада сұрыптауды екі реттелмеген элементтердің орнын ауыстыратын
swap функциясы арқылы орындалатынын қарастырайық.
Егер swap функциясы келесі түрде анықталса:
void swap (int x, int y)
{ int temp;
temp=x; x=y; y=temp;
}
онда swap(a,b)-ны шақыру a мен b айнымалыларына ешқандай әсер етпейді, swap
олардың мәндерінің көшірмесін ғана алады. Нәтижеге жету үшін алмастырулар,
swap функциясының формальды параметрлері көрсеткіш ретінде сипатталуы
керек, ал функцияны шақырудағы аргументтер , swap (&a, &b)-ның сәйкес
параметрлерінің адрестерімен көрсетілуі тиіс..
void swap (int *px, int *py)
{int temp;
temp=*px; *px=*py; *py=temp;
}
Си-де көрсеткіштер мен массивтердің арасында байланыс бар, байланыс өте
тығыз болғандығы соншалықты, бұл құралдарды бірге қарастырған дұрыс.
Индекстеу операциясынан басқа массивтің элементтеріне қатынасу
көрсеткіштерінің көмегімен орындалуы мүмкін және мұндай вариант жылдамырақ
жұмыс жасайды.
int ar[10] декларациясы 10 өлшемді ar массивті анықтайды, яғни ar[0],
ar[1],...,ar[9] атымен берілген 10 бөліктен тұратын объектілер тізбегі. ar[i]
жазбасы массивтің і-ші элементін білдіреді.
Егер pa int көрсеткіші болса, яғни былайша анықталса
int * pa;
онда меншіктеу нәтижесінде pa=&a[0]; pa көрсеткіші ar-дің нөлінші
элементін көрсетеді (сілтейді); басқаша айтқанда , pa ar[0] элементінің
адресінен тұрады.
x=* pa меншіктеулі; ar[0] –нің мәнін х-ке көшіреді.
Егер pa массивтің кейбір элементін көрсетсе, онда pa+1 анықтама бойынша
келесі элементті көрсетеді, pa+i –p-дан кейінгі i-ші элементті, ал pa-і-ра-
ның алдындағы і-ші элеметті көрсетеді.Бұдан, егер ра ar[0]-ді көрсетсе,
онда *( pa+1) - ar[1]-дің мәні, pa+i – ar[i]-дің адресі, а *(pa+i) –ar[i]-
дің мәні болады.
Бұдан, массивтің элементтері бірдей жылжытып қою көрсеткіші түрінде және
индексімен берілген массив түрінде бейнеленеді.
Көрсеткіш - бұл айнымалы, ал массивтің аты - бұл тұрақтылы көрсеткіш,
осы тұрғыдан ра=а немесе ра++ деп жазуға болады, ал аr=ра немесе аr++
жазбасы қателік тудырады.
Егер массивтің аты функцияға берілсе, онда соңғысы аргумент ретінде оның
бастапқы элементінің адресін алады. Шақырылатын функцияның ішінде бұл
аргумент адрестен тұратын жергілікті айнымалы болып табылады. Жалпы,
функция массивтің атын өзінің аргументі ретінде қарастыра алады, өйткені
оған массив аты сияқты ( char s [ ], немесе көрсеткіш ретінде char *s)
ыңғайлы, және олармен сәйкес жұмыс жасайды. Функция сондай-ақ жазбаның екі
түрінде, егерде оған бұл қолайлы болып көрінсе қолдана алады.

Көрсеткіштер массиві. Көпөлшемді массивтер.

Кез-келген басқа айнымалылар сияқты, көрсеткіштерді массивке
топтастыруға болады. Ақпараттық жүйелерде іздеу алгоритмдері және әртүрлі
табиғаттағы мәліметтерді сұрыптау, жеке жағдайда кез-келген ұзындықтағы
мәтіндік жолдар кеңінен қолданылады. Іздеу алгоритмдері мен сұрыптаудың
тиімділігі көп жағдайда мәліметтердің көрінісін таңдаумен байланысты.
Осындай ыңғайлы және тиімді көріністің бірі кез-келген ұзындықтағы мәтіндік
жолдың басындағы көрсеткіштер массиві болып табылады.
Жадыда жолдар бір-бірімен тығыз орналасқандықтан, әр жеке жолға
көрсеткіш арқылы оның бірінші литеріне қатынас жасау жүзеге асады.
Көрсеткіштердің өзін массив түрінде ұйымдастыруға болады.
Мүмкіндіктердің бірі: екі жолдарды салыстыру арқылы – олардың strcmp
функцияларына көрсеткіштерді беру. Жолдардың орындарын ауыстыру үшін,
массивте олардың көрсеткіштерінің орнын ауыстыру жеткілікті (жолдардың өзін
емес).
Бұдан екі мәселе бірдей шешіледі: біреуі – жадыны басқару
күрделілігімен, ал екіншісі – жолдардың өзін ауыстыруда жинақталған үлкен
шығындармен байланысты.
Сұрыптау процессі үш кезеңге бөлінеді:
- енгізу кезінде барлық жолдарды оқу;
- енгізілген жолдарды сұрыптау;
- оларды рет-ретімен басып шығару.
Енгізу программасы барлық жолдардағы литерлерді оқу және есте сақтау
керек, сол сияқты жолдардың көрсеткіштер массивін тұрғызу керек. Бұл
функция сол сияқты, енгізілген жолдардың санын есептеу керек – бұл ақпарат
сұрыптау және баспаға шығару үшін қажет болады.
Шығару программасы жолдарды басып шығарумен ғана айналысады және ол
көрсеткіштер массивінде оларға сілтеме жасайтындай ретпен орындалуы керек.
Сұрыптау алгоритмі ретінде 1962 жылы К.А. Хоор ұсынған тез сұрыптауды
пайдалану ұсынылған.
Си-де тікбұрышты көпөлшемді массивтерді және жеке жағдайда екі өлшемді
массивтерді беру мүмкіндігі бар. Си-де екі өлшемді массивтің ерекшелігі
жазбаның формасында ғана, ал қалған жағдайда оны басқа тілдердегідей айтуға
болады. Элементтер жолдармен есте сақталады, сәйкесінше, олар жадыда қалай
орналасқан сияқты ретпен таңдағанда, көбінесе ең бірінші индексі өзгереді.
Массив фигуралы жақшамен жабылған бастапқы мәндердің тізімімен
инициализацияланады; екі өлшемді массивтің әр жолы сәйкес ішкі тізімдермен
инициализацияланады.
Егер екі өлшемді массив функцияға аргумент ретінде берілсе, онда оның
параметріне сәйкес декларация бағандар санынан тұруы керек; осы жағдайда,
әдеттегідей функцияға массив жолдарының сілтемесі берілетіндіктен, жолдар
саны болмайды.
Екі өлшемді массив декларациясын қарастырайық
int ar[5] [10];
Егер ar массиві f –тің кейбір функциясына берілсе, онда бұл функцияны
келесі түрде анықтауға болады:
f(int array[5][10]) {...};
Бұның орнына төмендегіні жазуға болады:
f( int array [][10]) {...}
мұнда жолдар санының маңызы жоқ болғандықтан немесе
f( int (*array )[10]) {...}
соңғы жазбада параметр int типті 10 мәннен тұратын массивтің көрсеткіші
екенін сипаттайды. Тік [] жақшаның *-ға қарағанда приоритеті жоғарырақ
болғандықтан, мұнда жақша қажет болады. Жақшасыз (дөңгелек) декларация int
* array[10] int-тің 10 көрсеткішінен тұратын массивті анықтайды. Жалпы
жағдайда тек бірінші өлшемді (бірінші индеске сәйкес келетін) бермеуге
болады, қалған басқаларының өзгешеліктерін анықтау қажет.

Көрсеткіштер массивінің инициализациясы. Көпөлшемді массивтердің
орнындағы көрсеткіштер.

Көрсеткіштер массивтің инициализациясының механизмін n-20 айдың атынан
тұратын, стринг литеріне сілтеме жасауды қайтаратын, month-name (n)
функциясының мысалында көрсетейік. Бұл функция статистикалық массивтерді
қолдануды көрсету үшін өте жақсы. Функцияның стринг массивтері бар, олардың
біреуіне ол сілтеме жасауды қайтарады.

month_name: char * month _ name (int n) – n-20 айдың атын қайтарамыз
{ static char * name [] { “Дұрыс емес ат”,
“Қаңтар”, “Ақпан”, “Наурыз”, “Сәуір”, “Мамыр”, “Маусым”, “Шілде”,
“Тамыз”, “Қыркүйек”, “Қазан”, “Қараша”, “Желтоқсан”,};
return (n1 ¦¦ n12)? name [0]: name [n];

Инициализатор ретінде стрингтер тізімі қызмет атқарады, олардың
әрқайсысына массивте белгілі бір орын сәйкес келеді. і-ші стрингтің литері
жадыда орналасқан және оларға көрсеткіш name [і]-де есте сақталады. name
массив өлшемінің өзгешеліктері анықталмағандықтан, компилятор оны берілген
бастапқы мәннің мөлшері бойынша есептейді (инициализацияланатын өрнек).
Екі өлшемді массив пен көрсеткіш массивтерінің арасындағы айырмашылық
қандай? Келесі анықтамалар үшін:
int ar [10][20];
int*x[10];
ar[3] [4] жазбасы және x[3] [4]-те int типінің кейбір мәндеріне сілтеме
синтаксистік жағынан дұрыс болады. Бірақта ar ғана расында да екі өлшемді
массив болып табылады: int типінің екі жүз элементі үшін жады бөлінеді, ал
ar [жол, баған] элементін жылжытып қою массивтің басынан бастап, оның
тікбұрышты табиғатын ескере отырып, 20 * жол + баған, формуласы бойынша
есептеу жүргізіледі.
х массиві үшін 10 ғана көрсеткіш анықталады және ол инициализациясыз.
Инициализация анық түрде ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Си және Си тілініңи көрсеткіштері мен массив элементтері
Си программалау тілі
Массив элементтерінің түрлеріне шектеулер
Жиымдар (массивтер)
Си тілінен дәрістер
Дельфи программалау ортасы
Массивтермен жұмыста көрсеткіштерді пайдалану
Маркетингтегі ақпараттық жүйе
Кәсіпорын тауарлық қорын есептеу және талдаудағы ақпараттық жүйесін құру
Объектті бағытталған программалау
Пәндер