Международный гуманитарно-технический



бет29/37
Дата22.06.2023
өлшемі2,73 Mb.
#179096
түріЛекция
1   ...   25   26   27   28   29   30   31   32   ...   37
Байланысты:
konspekt lektsiya-2021-2022

Сілтеме арқылы параметрді беру. Си тілінде сілтеме бойынша шақыруды ұйымдастыру үшін көрсеткіштер жəне жанама адрестеу операциялары қолданылады. Аргументтері өзгеріп отыратын функция шақырылса, онда бұл жағдайда оған аргумент адресі беріледі. Əдетте бұл мақсатқа мəні өзгеріп отыратын айнымалыға адресті алу (&) операциясы қолданылады. Функцияға айнымалының адресі берілгенде оның мəнін өзгерту үшін жанама адрестеу (*) операциясы қолданылуы мүмкін. Келесі бағдарламада параметрді сілтеме бойынша беруге мысал келтірілген. Берілген функция x жəне yайнымалыларының мəнін өзгертеді. x жəне y айнымалылар адресінің функцияларын беру жолы бойынша біз оған оларға қатынас жасауға мүмкіндік бердік. Көрсеткіштерді жəне (*) операциясын қолдану арқылы функция жадының сəйкес ұяшығында орналастырылған өлшемдерді шығарды жəне оларды орындарымен ауыстыра алды.
Бір өлшемді жəне екі өлшемді массивтерді өңдеу барысында көрсеткіштерді қолдану.
Массивтер жəне көрсеткіштер. Массивтерді баяндағанда мəліметтер типі жəне талап етілетін жады класы көрсетіледі. қарапайым айнымалылар жағдайындағы қарастырылған сəйкес қасиеттер массивтерге де баяндағанда қолданылуы мүмкін. Массивті баяндауға мысал қарастырайық:
int b[30]; /*30 бүтін элементтен тұратын сыртқы массив*/
float a[30]; /*30 саннан тұратын float типті автоматты массив*/
static char c[20]; /* 20 символдан тұратын статикалық массив*/
extern b[ ]; /*сыртқы массив; өлшемі жоғарыда келтірілген*/
}
Жадылар класына байланысты сыртқы, статикалық, автоматты жəне регистрлік массивтер болып ерекшеленеді. Массивті инициалдауды қарастырайық. Типті баяндауда тек қана сыртқы жəне статикалық массивтерді ғана инициалдауға болады. Сыртқы жəне статикалық массивтерді баяндау келісім бойынша осы массив элементтерінің нөлденуіне əкеледі. (Сонымен, статикалық жəне сыртқы массивтерді нөлдеу үшін ешқандай шара қолданбауға болады). Сыртқы массивтің инициалдануына мысал қарастырайық, массив элементтерінің мəндері потоктың əрбір тобының студенттер саны болады:
int stud[10]={10,12,14,16,12,10,17,10,15,13};
main( )
{ int i;
extern int stud{ }; /*маңызды _______емес баяндалу*/
for (i=0; i<10; i++)
printf(“Группа N %d %d студентов”, i+1, stud[i]); }
stud[10] массиві жақшаларға алынған тізіммен инициалдаған, тізімнің элементтерін үтір арқылы бөлген. Тізімдегі элементтер саны массивтің өлшеміне сəйкес болуы қажет. Егер Тізімдегі элементтер саны массивтің өлшемінен аз болса, онда қалған массив элементтері нөлдік мəндерге ие болады. Егер тізімде элементтер көп болса, онда қате тура хабарланады. Массив элементтерін инициалдауды келесі түрде де көрсетуге болады:
int stud[ ]={10,12,15,16,17,11,18,10};
main ( )
{ int i;
extern int stud [ ];
for (i=0; iprintf (“Группа N %d %d студентов.\n”,i+1,stud[i]); }
Егер массивті инициалдауға бос батырмалар лар қолданылса, онда компилятор өзі тізімдегі элементтер санын анықтайды жəне ол үшін қажетті өлшемдегі массивті белгілейді. Массивтің өлшемін анықтау үшін sizeof операторы қолданылады. sizeof операторы объектінің немесе типтің өлшемін байтпен анықтайды. Массив элементтерінің санын анықтау үшін массив орын алатын жалпы байттар санын 2-ге бөледі (берілген жүйеде int типті əрбір элементтің өлшемі 2 байтқа тең). Жалпы жағдайда сəйкес типтің sizeof айнымалысының мəніне бөледі. Массивтердің көрсеткіштері. Жоғарыда айтылғандай, көрсеткіштер символдық адрестермен жұмыс істеуді ұйымдастырады. (Бұл жағдайда массивті өңдеу тиімдірек ұйымдасады). Массивті белгілеу жасырын түрде көрсеткіштерді қолдану болып табылады. Мысалы, массивтің аты сондай-ақ соңғы элементті анықтайды, яғни егер a[] массив болса, онда соңғысы a[0].
Екі мəнде барлық бағдарламаның барысында өзгермейтін болғандықтан, көрсеткіш типті константа болады. Оларды көрсеткіш типті айнымалыға (мəн ретінде) меншіктеуге болады жəне айнымалының мəнін өзгертуге болады. Адрестеудің бірлігі байт болып табылады, бірақ int типі 2 байтты, ал float типі 4 байтты қолданады.
«Көрсеткішке бірді қосу»-компилятор бірді жадыға қосады. Массив үшін бұл келесі байт емес, келесі элементтің адресіне көшу болып табылады. Сондықтан да көрсеткіш сілтенетін объектінің типі арнайы ескертіледі.
Келесі теңдікті қарастырайық:
a+2==&a[2]; /*екеуі де бірдей адрес*/
*(a+2)==a[2]; /*екеуі де бірдей мəн*/
Бұл ара қатынастар массивтер мен көрсеткіштердің арасындағы байланысты көрсетеді, яғни көрсеткішті массивтің жеке элементін, сондай-ақ оның мəнін анықтау үшін қолдануға болады. Нақтылы біз екі əртүрлі белгілеулерді бірдей қолданамыз. Шыныменде, компилятор массив белгілуін көрсеткіштерге айналдырады, сондықтан көрсеткіштер əдістері маңыздырақ. Көрсеткіштерді қолданып, массивтермен жұмыс істеу. Массивтерді қолданатын функцияны қарастырайық, содан кейін осы функцияны көрсеткіштерді пайдаланып, жазу керек. Функцияны көрсеткіштерді қолданып, қайтадан жазамыз. Ра-ны int типіне сілтенетін көрсеткіш деп баяндаймыз. Содан соң a[i] массив элементтерін сəйкесінше *(pa+i) мəніне ауыстырамыз. Массив аты көрсеткіш болғандықтан, келесі баяндалу операторлары əрекеттері бойынша ұқсас, яғни екеуі де ра көрсеткішімен баяндалады. int pa[ ]; и int *pa; Программада бұлардың кез келгенін қолдануға болады, əйтсе де біз екінші түрін *(pa+i)-ды қолданамыз.
Екі өлшемді массивтермен жұмыс істегенде көрсеткіштерді қолдану. a[3][2] массивін қарастырамыз.
int a[3][2]; /* 3 жолдан жəне 2 бағаннан тұратын int типті массив */
int *pri; /* бүтін типке сілтейді */
pri=a; /* көрсеткіш a[0][0] элементіне сілтейді */
a==&a[0][0]; /* pri+1 көрсеткіші a[0][1] элементке сілтейді */
Бұл массивті қарастырғанда келесі теңдеулер орынды:
pri==&a[0][0]; /* 1-ші жол, 1-ші баған */
pri+1==&a[0][1]; /* 1-ші жол, 2-ші баған */
pri+2==&a[1][0]; /* 2-ші жол, 1-ші баған */
pri+3==&a[1][1]; /* 2-ші жол, 2-ші баған */
pri+4==&a[2][0]; /* 3-ші жол, 1 -ші баған */
pri+5==&a[2][1]; /* 3-ші жол, 2-ші баған */
Екі өлшемді массив бір өлшемді массивтерден құрылған массив ретінде қарастырылуы мүмкін. Яғни, берілген екі өлшемді массив 3 жолдан тұрады, ал əрбір жол 2 элементтен тұратын массив болып табылады. Бірінші жолдың аты a[0], екінші жолдың аты a[1 ], үшінші жолдың аты a[2]. Массивтің аты берілген массивтің көрсеткіші болып табылады, яғни ол массивтің 1-ші элементіне сілтейді. Сонымен келесі теңдеулер орынды:
a[ 0]==&a[0][0]
a[ 1]==&a[1][0]
a[ 2]==&a[2][0].
Бұл қасиет бір өлшемді массивке арналған функцияны екі өлшемді массивпен жұмыс істеу үшін мүмкіндік береді. Бөлшектеп емес, барлық циклдарымен бірге екі өлшемді массивпен жұмыс істейтін функцияны баяндау үшін функцияның анықтамасын жəне оның баяндалуын дұрыс жазу қажет.


Достарыңызбен бөлісу:
1   ...   25   26   27   28   29   30   31   32   ...   37




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

    Басты бет