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


Жұмыс түрі: Реферат
Тегін: Антиплагиат
Көлемі: 12 бет
Таңдаулыға:
Кіріспе
Си-де функциялар өзінің аргументтері ретінде параметрлер мәнін қабылдайтын болғандықтан, тікелей мүмкіншілік шақырылатын функцияда айнымалыны өзгертуге болмайды.
Қажетті нәтижені алу үшін, шақырылатын программада өзгертілуі тиісті мәнге көрсеткіштерді беру қажет. Бұл жағдайда шақырылатын функция формальды параметрлердің көрсеткіштер ретінде сипатталуы қажет, бұдан параметрлердің мәніне қатынасу олар арқылы жанама түрде жүргізіледі. Формальды параметрлер - шақырылатын функцияда оның программасын шақыратын объектіге қатынасуды жүзеге асыратын көрсеткіштер және осы объектілерді өзгертуге мүмкіндік береді.
Программада сұрыптауды екі реттелмеген элементтердің орнын ауыстыратын 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 (n<1 ¦¦ n>12) ? 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 ғана көрсеткіш анықталады және ол инициализациясыз. Инициализация анық түрде - статистикалық немесе есептеу процесінде берілуі тиіс.
Егер әрбір x элементі бес элементті массивке сілтеме жасаса, онда нәтижесінде жадыда int типті 50 мәнді орналастыру үшін және көрсеткіштердің 10 ұяшықты үшін кеңістік бөлінеді.
Көрсеткіштердің маңызды артықшылығы мұндай массивтің жолдары әр түрлі ұзындыққа ие бола алатындығында.
Си-ді қолдауды қамтамасыз ететін операциялық жүйеде, командалық жолдың көмегімен жіберілетеін программадағы параметрлер немесе аргументтерді беру мүмкіншілігі бар. Біріншіден, әдетте argc (argument count) деп аталатын, командалық жолда беріген аргументтер саны тұрады. Екінші argv (argument vector) аргументтердің өзі тұратын литерлік стрингтер массивіне сілтеме жасау болып табылады. Бұл стрингтермен жұмыс жасау үшін әдетте бірнеше деңгейлердің көрсеткіштері қолданылады. Бір жолдағы командалық жады аргументтерін бір-бірінен бос орынмен бөле отырып басып шығаратын, echo (эхо) деп аталатын қарапайым программа - мысалы. Сонымен команда
Echo Здравствуй, мир! - ді басып шығарады.
# include <stdio. h>
main (int argc, char*arg [] )
{int i;
for (i=1; i<argc; i++)
printf (“% s % s”, argv [i], (i<argc-1) ? ” ”: ” ”) ;
printf (“\n”) ;
return 0 ;
}
argv [0] келісімі бойынша шығарылатын программалық аты бар, сондықтан argc-нің мәні әрқашанда 1-ден кем болмайды. Егер argc=1, онда командалық жадыда программаның атынан кейін ешқандай да аргументтер болмайды. Біздің масалымызда argc 3-ке тең, және сәйкесінше argv[0] =“echo”; argv [1] = “Здравствуй”, argv [2] = “мир!” болады. Стандарт argv [argc] әрқашанда бос көрсеткіш болғанын талап етеді.
argv көрсеткіштер массивіне көрсеткіш болғандықтан, біз онымен индекстелінетін массив ретінде емес, көрсеткіш ретінде жұмыс жасай аламыз. echo, программаның екінші версиясын келтіреміз, мұнда көрсеткішке көрсеткіш, сондай-ақ профикстік операторлар ұғымдарын қолданылады.
# include <stdio. h>
main (int argc, char * argv [] )
{while (--argc >0)
printf (“% s % s”, *++ argv, (argc>1) ?’’:’’) ;
printf (“\n”) ;
return 0 ;
}
Құрылымдар мен функциялар.
Құрылымдарға орындалатын операциялар - бұл оларды көшіру, меншіктеу, & операторының көмегімен аталатын адрес және олардың мүшелеріне қатысудың жүзеге асырылуы. Құрылымды функцияға аргумент ретінде беру және оларды нәтиже түрінде функциялардан қайтару. Сондай-ақ көшіру және меншіктеу операцияларына жатады. Құрылымдарды салыстыруға болмайды.
Құрылымдық объектілерді функцияға берудің үш тәсілі бар:
- компоненттерді (мүшелерді) жеке беру;
- барлық құрылымдарды түгелдей беру;
- көрсеткішті құрылымға беру.
Егер функцияға, оны түгелдей көшіретін үлкен құрылым берілсе, көрсеткішті оған беру тиімдірек.
struct point *pp; декларациясы рр - struct point типті структураға көрсеткіш екенін хабарлайды.
Егер рр - point құрлымына жіберілсе (одан болса), онда *рр-тің өзі құрылым, ал (*рр) . х және (*рр) . у - point құрлымының мүшелері болады. рр көрсеткішін қолдана отырып,
struct point origin, *pp;
pp=&origin;
printf (“origin:(%d, %d) \n”, (*pp) . x, (*pp) . y) ;
жазуға болады
* операторының приоритетінен . операторының приоритеті жоғары болғандықтан, (*рр) . х-дағы жақша қажет.
“Құрлымдағы көрсеткіш” түсінігімен байланысты мүшелерге қатынас жасау үшін жазбаның қысқаша формасы енгізіледі. Егер р - құрылымға көрсеткіш болса, онда p->құрылым_мүшесі - оның жеке мүшесі болады. Сондықтан printf-ты келесі түрде жазуға болады.
printf(“origin:(%d, %d) \n”, pp->x, pp->y) ;
Екі және -> операторларда солдан оңға қарай орындалады.
Құрылым мүшелеріне қатынас жасау. және -> операторлары функцияны шақыру ( ) және массивті индекстеу [ ] операторларымен бірге приоритеттер иерархиясында ең жоғарғы орынға ие және басқа кез-келген операторлардан бұрын орындалады.
Мысалы, егер декларация берілсе
struct
{ int len;
char*str;
} *p;
онда ++(р -> len) өрнекте жақшалар айқын түрде болғандықтан көрсеткіштердің өзі емес, ++р -> len бір мәнге len структурасының мүшесін өсіреді.
Операциялардың орындалу тәртібін өзгерту үшін анық жақшалар керек. (++р) -> len-де len-нің мәнін алмас бұрын, программа р көрсеткішін жылжытады.
Құрылым массивтері
... жалғасы- Іс жүргізу
- Автоматтандыру, Техника
- Алғашқы әскери дайындық
- Астрономия
- Ауыл шаруашылығы
- Банк ісі
- Бизнесті бағалау
- Биология
- Бухгалтерлік іс
- Валеология
- Ветеринария
- География
- Геология, Геофизика, Геодезия
- Дін
- Ет, сүт, шарап өнімдері
- Жалпы тарих
- Жер кадастрі, Жылжымайтын мүлік
- Журналистика
- Информатика
- Кеден ісі
- Маркетинг
- Математика, Геометрия
- Медицина
- Мемлекеттік басқару
- Менеджмент
- Мұнай, Газ
- Мұрағат ісі
- Мәдениеттану
- ОБЖ (Основы безопасности жизнедеятельности)
- Педагогика
- Полиграфия
- Психология
- Салық
- Саясаттану
- Сақтандыру
- Сертификаттау, стандарттау
- Социология, Демография
- Спорт
- Статистика
- Тілтану, Филология
- Тарихи тұлғалар
- Тау-кен ісі
- Транспорт
- Туризм
- Физика
- Философия
- Халықаралық қатынастар
- Химия
- Экология, Қоршаған ортаны қорғау
- Экономика
- Экономикалық география
- Электротехника
- Қазақстан тарихы
- Қаржы
- Құрылыс
- Құқық, Криминалистика
- Әдебиет
- Өнер, музыка
- Өнеркәсіп, Өндіріс
Қазақ тілінде жазылған рефераттар, курстық жұмыстар, дипломдық жұмыстар бойынша біздің қор #1 болып табылады.

Ақпарат
Қосымша
Email: info@stud.kz