Лекц № 6
Си-гийн заагч
А. Хүдэр
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
212/16/2015Vanderbilt university
 Утга нь санах ойн хаяг байна
 Энгийн хувьсагчид ямар нэг утга хадгалдаг
(шууд хаяглалт)
 Заагч нь ямар нэг утга агуулж байгаа
хувьсагчийн хаягийг агуулна (шууд бус
хаяглалт)
312/16/2015Vanderbilt university
 Заагч хувьсагчид * - ыг хэрэглэнэ
int *myPtr;
 int төрлийн заагчийг тодорхойлно (int * төрлийн заагч)
 Олон заагч зарлах бол хувьсагч бүрийн өмнө * -ыг бичнэ
int *myPtr1, *myPtr2;
 Ямар ч төрлийн заагч зарлаж болно
 Заагчийн анхны утгаар 0, NULL эсвэл ямар нэг хаяг өгөх
◦ 0 эсвэл NULL – юуг ч заахгүй
◦ 0 нь заагчид олгож болох цорын ганц бүхэл утга юм
◦ Заагчид анхны утгыг нь 0 гэж олгох нь NULL -ыг олгохтой
ижил боловч NULL –ыг ихэвчлэн хэрэглэнэ
◦ NULL -ыг <stddef.h>, <stdio.h> гэх мэт хэд хэдэн толгой
файлд тодорхойлсон байдаг
412/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
512/16/2015Vanderbilt university
 & (хаяг авах үйлдэл)
◦ Операндынхаа хаягийг буцаана
int y = 5;
int *yPtr;
yPtr = &y; /* yPtr заагч y – гийн хаягийг авна */
 /* yPtr заагч y-г заана*/
612/16/2015Vanderbilt university
 * (шууд бус хаяглалт/хаяглах үйлдэл)
◦ Операндынхаа зааж байгаа зүйлийн өөр
нэр/зохиомол нэрийг буцаана
◦ *yptr нь y-ийг буцаана (yptr нь y-г зааж байгаа
учир)
◦ *-ыг утга олгоход хэрэглэж болно
 Объектийн өөр нэрийг буцаана
 *yptr = 7; /* changes y to 7 */
 Хаяглалтанд хэрэглэж байгаа заагч нь (*-ын
операнд) lvalue байх ѐстой (тогтмол байж болохгүй).
 * ба & нь эсрэг үйлдлүүд юм
 Бие биенийгээ устгана
712/16/2015Vanderbilt university
Хэрэв aPtr нь a-г зааж байгаа
бол &a болон aPtr нь ижил
утга юм
a болон *aPtr нь ижил
&*aPtr болон *&aPtr нь ижил
утгатай
812/16/2015Vanderbilt university
912/16/2015Vanderbilt university
1012/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
1112/16/2015Vanderbilt university
 Заагч аргумент ашиглан хаягаар дуудах
◦ Аргументийн хаягийг & оператор ашиглан дамжуулна
◦ Санах ой дахь бодит байрлал дээр өөрчлөлт хийх
боломж олгоно
◦ Хүснэгтийг дамжуулахад & үйлдлийг ашиглахгүй, учир
нь хүснэгтийн нэр өөрөө заагч байдаг
 * оператор
◦ Функцийн дотор хувьсагчийн өөр нэр ашиглахад
хэрэглэгдэнэ
void timestwo( int *number )
{
*number = 2 * ( *number );
}
◦ *number нь дамжуулагдсан хувьсагчийн өөр нэр
байдлаар ашиглагдана
1212/16/2015Vanderbilt university
1312/16/2015Vanderbilt university
14
Заагч аргумент авах функцийн загвар
cubeByReference функц руу
заагч хувьсагчийн утга байж
болох хаяг дамжуулсан
Энэ програмд *nPtr нь number – тэй
адил тул энэ үйлдэл нь number
хувьсагчийн утгыг өөрчилнө
12/16/2015Vanderbilt university
1512/16/2015Vanderbilt university
1612/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
1712/16/2015Vanderbilt university
 const тодорхойлогч
◦ Хувьсагчийн утга өөрчлөгдөхгүй
◦ Хэрэв функц ямар нэг хувьсагчаа өөрчлөх хэрэггүй бол
const тодорхойлогчийг хэрэглэнэ
◦ const хувьсагчийг өөрчлөх гэж оролдвол алдаа гарна
 const заагчид
◦ Санах ойн тогтмол байрлал руу заана
◦ Тодорхойлох үедээ анхны утгыг нь олгох ѐстой
◦ const int *myPtr = &x;
 const int төрлийн энгийн заагч
◦ int *const myPtr = &x;
 int *const төрөл нь int төрлийн тогтмол заагч юм
 x нь өөрчлөгдөж болох боловч myPtr өөрчлөгдөхгүй
◦ const int *const Ptr = &x;
 const int төрлийн const заагч
1812/16/2015Vanderbilt university
19
sPtr болон *sPtr хоѐулаа тогтмол
биш
12/16/2015Vanderbilt university
20
sPtr болон *sPtr-ын утгыг
converttoUppercase функц
өөрчилнө
12/16/2015Vanderbilt university
21
sPtr заагчийг өөрчилж болохгүй боловч зааж
байгаа өгөгдөл *sPtr-ийг өөрчилж болно
12/16/2015Vanderbilt university
22
sPtr-ийг printCharacters функц
өөрчилж байна
12/16/2015Vanderbilt university
23
xPtr заагч өөрчлөгдөнө харин зааж байгаа
өгөгдөл *xPtr нь өөрчлөгдөхгүй
Хөрвүүлэлтийн алдаа!
*xPtr нь const тодорхойлогчтой
байхад утгыг нь өөрчлөх гэвэл
алдаа гарна
12/16/2015Vanderbilt university
24
ptr заагч өөрчлөгдөхгүй боловч зааж
байгаа *ptr өгөгдөл тогтмол биш
Хөрвүүлэлтийн алдаа!
12/16/2015Vanderbilt university
25
Заагч sPtr болон өгөгдөл *sPtr
хоѐулаа тогтмол
Хөрвүүлэлтийн алдаа!
12/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
2612/16/2015Vanderbilt university
 Заагч ашиглан бөмбөлгөн эрэмбэлэлтийг
хэрэгжүүлэх
◦ Хоѐр элементийн байрыг солих
◦ swap функц хүснэгтийн элементүүдийн хаягийг
хүлээж авна (& - г хэрэглэн)
◦ Заагч болон * операторыг хэрэглэн swap функц
хүснэгтийн элементүүдийг солино
 Псевдокод
Хүснэгтэд анхны утга олгох
өгөгдлийг анхны хэлбэрээр нь хэвлэх
bubblesort функцийг дуудах
эрэмбэлэгдсэн хүснэгтийг хэвлэх
bubblesort функцийг тодорхойлох
2712/16/2015Vanderbilt university
2812/16/2015Vanderbilt university
2912/16/2015Vanderbilt university
30
swap функц нь хоѐр заагчийн зааж буй
int төрлийн утгуудын байрыг солино
12/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
3112/16/2015Vanderbilt university
 sizeof
◦ Операндын хэмжээг байтаар буцаана
◦ Хүснэгтийн хувьд: нэг элементийн хэмжээ х
элементийн тоо
◦ Хэрэв sizeof(int) нь 4 байт бол
int myArray[ 10 ];
printf( "%d", sizeof( myArray ) );
 40 гэж хэвлэнэ
 sizeof-ыг доорх зүйлд ашиглаж болно
◦ Хувьсагчийн нэр
◦ Төрлийн нэр
◦ Тогтмолын нэр
3212/16/2015Vanderbilt university
33
float нь санах ойд 4 байт эзэлдэг бол 20
ширхэг float нь 80 байт болно
12/16/2015Vanderbilt university
3412/16/2015Vanderbilt university
3512/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
3612/16/2015Vanderbilt university
 Заагч дээр арифметик үйлдэл хийж болно
◦ Заагчийг нэмэгдүүлэх/хорогдуулах (++ эсвэл --)
◦ Заагч дээр бүхэл тоо нэмэх (+ эсвэл +=, - эсвэл
-=)
◦ Заагчуудыг бие биенээс нь хасч болно
◦ Эдгээр үйлдлүүдийг хүснэгт дээр хийх үед л
утгатай байна
3712/16/2015Vanderbilt university
 Бүхэл тоон төрөл нь 4 байт байдаг машин
дээрх 5 элементтэй хүснэгт
◦ vPtr эхний элемент v[0] рүү заана
 3000 гэсэн байрлал руу (vPtr=3000)
◦ vPtr+=2; vPtr-ийг 3008 утгатай болгоно
 vPtr нь v[2] руу заах (2-оор нэмэгдсэний дараа) ба, машин
4 байтын int төрөлтэй тул зааж буй хаяг нь 3008 болно.
38v хүснэгт ба түүн рүү заах vPtr заагч 12/16/2015Vanderbilt university
3912/16/2015Vanderbilt university
 Заагчийг хасах
◦ Нэг заагчаас нөгөөг хүртлэх элементийн тоог
буцаана. Хэрэв
vPtr2 = v[2];
vPtr0 = v[0];
◦ vPtr2 – vPtr0 нь 2 болно
 Заагчийг харьцуулах
◦ Аль заагч нь илүү их дугаартай хүснэгтийн
элемент зааж байгааг олох
◦ Заагчийн утга 0-тэй тэнцүү эсэхийг шалгах
4012/16/2015Vanderbilt university
 Ижил төрлийн заагчдын хооронд утга
олгох үйлдэл хэрэглэж болно
◦ Хэрэв төрөл нь ялгаатай бол төрөл хувиргах
үйлдэл хэрэглэнэ
◦ Онцгой тохиолдол: void төрлийн заагч (void *
төрөл)
 Ерөнхий заагч, ямар ч төрлийг зааж чадна
 void заагч руу шилжүүлэхэд төрөл хувиргалт
хэрэггүй
 void төрлийн заагч дээр шууд бус хаяглалтыг хийж
болохгүй
4112/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
4212/16/2015Vanderbilt university
 Заагч ба хүснэгт нь нягт холбоотой
◦ Хүснэгтийн нэр нь тогтмол заагч юм
◦ Заагчаар хүснэгтийн индексийн үйлдлийг хийж
болно
 b[5] хүснэгт ба bPtr заагч зарлая
◦ Тэдгээрийг ижил болгохын тулд дараах үйлдлийг
хийнэ
bPtr = b;
 Хүснэгтийн нэр (b) нь b[5] хүснэгтийн эхний
элементийн хаяг юм
bPtr = &b[0];
 bPtr заагчид b хүснэгтийн эхний элементийн хаягийг
олгоно
4312/16/2015Vanderbilt university
 b[3] элемент
◦ *(bPtr+3) гэж хандаж болно
 Шилжилтийн утга n-ийн хувьд заагч/шилжилтийн
тэмдэглэгээ гэж нэрлэгддэг
◦ bPtr[3] гэж хандаж болно
 Заагч/индексийн тэмдэглэгээ гэж нэрлэгддэг
 bPtr[3] нь b[3] –тай адил
◦ Хүснэгт дээрээ заагчийн арифметикийг хэрэглэн
*(b+3) гэж хандаж болно
4412/16/2015Vanderbilt university
45
Хүснэгтийн индексийн
тэмдэглэгээ
Заагч/шилжилтийн
тэмдэглэгээ
12/16/2015Vanderbilt university
46
Заагчийн индекс тэмдэглэгээ
Заагчийн шилжилттэй
тэмдэглэгээ
12/16/2015Vanderbilt university
4712/16/2015Vanderbilt university
4812/16/2015Vanderbilt university
49
for давталтын нөхцөл дотор
үйлдэл гүйцэтгэж байна
12/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
5012/16/2015Vanderbilt university
 Хүснэгт нь заагчуудыг агуулж болно
 Жишээ: Тэмдэгт мөр төрлийн хүснэгт
◦ char *suit[ 4 ] = { "Hearts", "Diamonds”, "Clubs", "Spades" };
◦ Тэмдэгт мөр нь эхний үсгийнхээ заагч юм
◦ char * - suit-ийн элемент бүр нь char төрлийн заагч юм
◦ Тэмдэгт мөрүүд нь suit хүснэгтэд хадгалагдахгүй ба тэнд
тэдний зөвхөн заагчдыг хадгална
◦ suit хүснэгт нь тогтмол хэмжээтэй ба харин тэмдэгт
мөрүүд нь ямар ч хэмжээтэй байж болно
5112/16/2015Vanderbilt university
5212/16/2015Vanderbilt university
 Заагч хувьсагчийг зарлах ба анхны утга олгох
 Заагч дээрх үйлдлүүд
 Аргументыг функц руу хаягаар дамжуулах
 const тодорхойлогчийг заагч дээр ашиглах
 Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн
эрэмбэлэлт
 sizeof оператор
 Заагчтай илэрхийлэл ба заагчийн арифметик
 Заагч ба хүснэгт
 Заагч төрлийн хүснэгт
 Функцийн заагч
5312/16/2015Vanderbilt university
 Функцийн заагч
◦ Функцийн хаягийг заана
◦ Хүснэгтийн нэр эхний элементийнхээ хаяг
байдагтай адил
◦ Функцийн нэр нь функцийг тодорхойлсон кодын
эхлэлийн хаяг байна
 Функцийн заагч дээр дараах үйлдлүүдийг
хийж болно
◦ Функц руу дамжуулах
◦ Хүснэгтэнд хадгалах
◦ Өөр функцийн заагчид олгох
5412/16/2015Vanderbilt university
 Жишээ: bubblesort
◦ bubble функц аргументаар функцийн заагч авна
 bubble тэр туслах функцийг дуудна
 энэ нь өсөх эсвэл буурахаар эрэмбэлэхийг тодорхойлно
◦ bubble функцийн аргумент болох функцийн заагч:
int ( *compare )( int a, int b );
нь bubble-д хоѐр бүхэл тоон аргументтай, бүхэл тоо
буцаадаг функц орж ирэхийг заана
◦ Хэрэв хаалтуудыг орхивол:
int *compare( int a, int b );
 хоѐр int аргументтай, int-ийн заагч буцаадаг функц гэж
тодорхойлогдоно
5512/16/2015Vanderbilt university
56
bubble функц
аргументаараа функцийн
заагч авч байна
12/16/2015Vanderbilt university
57
Хэрэглэгчийн сонголтоос
хамааран bubble функц ascending
эсвэл descending функцийг хүснэгт
эрэмбэлэхэд ашиглаж байна
12/16/2015Vanderbilt university
58
Програм юуг эрэмбэлэгдээгүй
байна гэж үзэх нь bubble руу ямар
функцийн заагч дамжуулагдсанаас
хамаарна
12/16/2015Vanderbilt university
59
bubble функц руу ascending
функцийг дамжуулахад
програмын энэ хэсэгт ирнэ
bubble функц руу descending
функцийг дамжуулахад програмын
энэ хэсэгт ирнэ
12/16/2015Vanderbilt university
6012/16/2015Vanderbilt university
 Заагч: өгөгдлийн төрөл * заагч хувьсагчийн
нэр (%p, арван зургаатын бүхэл тоо)
 Утгаар дуудах (өөрчлөхгүй) ба хаягаар
дуудах (өөрчилнө)
 const тодорхойлогч нь хувьсагчийг
өөрчлөхгүй байхыг заана (дөрвөн хувилбар)
 sizeof нь хэмжээг байтаар тодорхойлно
 Заагчийн хүснэгт
 Функцийн заагч: функцийн нэр нь хаяг
байдаг
6112/16/2015Vanderbilt university

u.cs101 "Алгоритм ба програмчлал" Лекц №6

  • 1.
    Лекц № 6 Си-гийнзаагч А. Хүдэр
  • 2.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 212/16/2015Vanderbilt university
  • 3.
     Утга ньсанах ойн хаяг байна  Энгийн хувьсагчид ямар нэг утга хадгалдаг (шууд хаяглалт)  Заагч нь ямар нэг утга агуулж байгаа хувьсагчийн хаягийг агуулна (шууд бус хаяглалт) 312/16/2015Vanderbilt university
  • 4.
     Заагч хувьсагчид* - ыг хэрэглэнэ int *myPtr;  int төрлийн заагчийг тодорхойлно (int * төрлийн заагч)  Олон заагч зарлах бол хувьсагч бүрийн өмнө * -ыг бичнэ int *myPtr1, *myPtr2;  Ямар ч төрлийн заагч зарлаж болно  Заагчийн анхны утгаар 0, NULL эсвэл ямар нэг хаяг өгөх ◦ 0 эсвэл NULL – юуг ч заахгүй ◦ 0 нь заагчид олгож болох цорын ганц бүхэл утга юм ◦ Заагчид анхны утгыг нь 0 гэж олгох нь NULL -ыг олгохтой ижил боловч NULL –ыг ихэвчлэн хэрэглэнэ ◦ NULL -ыг <stddef.h>, <stdio.h> гэх мэт хэд хэдэн толгой файлд тодорхойлсон байдаг 412/16/2015Vanderbilt university
  • 5.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 512/16/2015Vanderbilt university
  • 6.
     & (хаягавах үйлдэл) ◦ Операндынхаа хаягийг буцаана int y = 5; int *yPtr; yPtr = &y; /* yPtr заагч y – гийн хаягийг авна */  /* yPtr заагч y-г заана*/ 612/16/2015Vanderbilt university
  • 7.
     * (шуудбус хаяглалт/хаяглах үйлдэл) ◦ Операндынхаа зааж байгаа зүйлийн өөр нэр/зохиомол нэрийг буцаана ◦ *yptr нь y-ийг буцаана (yptr нь y-г зааж байгаа учир) ◦ *-ыг утга олгоход хэрэглэж болно  Объектийн өөр нэрийг буцаана  *yptr = 7; /* changes y to 7 */  Хаяглалтанд хэрэглэж байгаа заагч нь (*-ын операнд) lvalue байх ѐстой (тогтмол байж болохгүй).  * ба & нь эсрэг үйлдлүүд юм  Бие биенийгээ устгана 712/16/2015Vanderbilt university
  • 8.
    Хэрэв aPtr ньa-г зааж байгаа бол &a болон aPtr нь ижил утга юм a болон *aPtr нь ижил &*aPtr болон *&aPtr нь ижил утгатай 812/16/2015Vanderbilt university
  • 9.
  • 10.
  • 11.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 1112/16/2015Vanderbilt university
  • 12.
     Заагч аргументашиглан хаягаар дуудах ◦ Аргументийн хаягийг & оператор ашиглан дамжуулна ◦ Санах ой дахь бодит байрлал дээр өөрчлөлт хийх боломж олгоно ◦ Хүснэгтийг дамжуулахад & үйлдлийг ашиглахгүй, учир нь хүснэгтийн нэр өөрөө заагч байдаг  * оператор ◦ Функцийн дотор хувьсагчийн өөр нэр ашиглахад хэрэглэгдэнэ void timestwo( int *number ) { *number = 2 * ( *number ); } ◦ *number нь дамжуулагдсан хувьсагчийн өөр нэр байдлаар ашиглагдана 1212/16/2015Vanderbilt university
  • 13.
  • 14.
    14 Заагч аргумент авахфункцийн загвар cubeByReference функц руу заагч хувьсагчийн утга байж болох хаяг дамжуулсан Энэ програмд *nPtr нь number – тэй адил тул энэ үйлдэл нь number хувьсагчийн утгыг өөрчилнө 12/16/2015Vanderbilt university
  • 15.
  • 16.
  • 17.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 1712/16/2015Vanderbilt university
  • 18.
     const тодорхойлогч ◦Хувьсагчийн утга өөрчлөгдөхгүй ◦ Хэрэв функц ямар нэг хувьсагчаа өөрчлөх хэрэггүй бол const тодорхойлогчийг хэрэглэнэ ◦ const хувьсагчийг өөрчлөх гэж оролдвол алдаа гарна  const заагчид ◦ Санах ойн тогтмол байрлал руу заана ◦ Тодорхойлох үедээ анхны утгыг нь олгох ѐстой ◦ const int *myPtr = &x;  const int төрлийн энгийн заагч ◦ int *const myPtr = &x;  int *const төрөл нь int төрлийн тогтмол заагч юм  x нь өөрчлөгдөж болох боловч myPtr өөрчлөгдөхгүй ◦ const int *const Ptr = &x;  const int төрлийн const заагч 1812/16/2015Vanderbilt university
  • 19.
    19 sPtr болон *sPtrхоѐулаа тогтмол биш 12/16/2015Vanderbilt university
  • 20.
    20 sPtr болон *sPtr-ынутгыг converttoUppercase функц өөрчилнө 12/16/2015Vanderbilt university
  • 21.
    21 sPtr заагчийг өөрчилжболохгүй боловч зааж байгаа өгөгдөл *sPtr-ийг өөрчилж болно 12/16/2015Vanderbilt university
  • 22.
    22 sPtr-ийг printCharacters функц өөрчилжбайна 12/16/2015Vanderbilt university
  • 23.
    23 xPtr заагч өөрчлөгдөнөхарин зааж байгаа өгөгдөл *xPtr нь өөрчлөгдөхгүй Хөрвүүлэлтийн алдаа! *xPtr нь const тодорхойлогчтой байхад утгыг нь өөрчлөх гэвэл алдаа гарна 12/16/2015Vanderbilt university
  • 24.
    24 ptr заагч өөрчлөгдөхгүйболовч зааж байгаа *ptr өгөгдөл тогтмол биш Хөрвүүлэлтийн алдаа! 12/16/2015Vanderbilt university
  • 25.
    25 Заагч sPtr болонөгөгдөл *sPtr хоѐулаа тогтмол Хөрвүүлэлтийн алдаа! 12/16/2015Vanderbilt university
  • 26.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 2612/16/2015Vanderbilt university
  • 27.
     Заагч ашигланбөмбөлгөн эрэмбэлэлтийг хэрэгжүүлэх ◦ Хоѐр элементийн байрыг солих ◦ swap функц хүснэгтийн элементүүдийн хаягийг хүлээж авна (& - г хэрэглэн) ◦ Заагч болон * операторыг хэрэглэн swap функц хүснэгтийн элементүүдийг солино  Псевдокод Хүснэгтэд анхны утга олгох өгөгдлийг анхны хэлбэрээр нь хэвлэх bubblesort функцийг дуудах эрэмбэлэгдсэн хүснэгтийг хэвлэх bubblesort функцийг тодорхойлох 2712/16/2015Vanderbilt university
  • 28.
  • 29.
  • 30.
    30 swap функц ньхоѐр заагчийн зааж буй int төрлийн утгуудын байрыг солино 12/16/2015Vanderbilt university
  • 31.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 3112/16/2015Vanderbilt university
  • 32.
     sizeof ◦ Операндынхэмжээг байтаар буцаана ◦ Хүснэгтийн хувьд: нэг элементийн хэмжээ х элементийн тоо ◦ Хэрэв sizeof(int) нь 4 байт бол int myArray[ 10 ]; printf( "%d", sizeof( myArray ) );  40 гэж хэвлэнэ  sizeof-ыг доорх зүйлд ашиглаж болно ◦ Хувьсагчийн нэр ◦ Төрлийн нэр ◦ Тогтмолын нэр 3212/16/2015Vanderbilt university
  • 33.
    33 float нь санахойд 4 байт эзэлдэг бол 20 ширхэг float нь 80 байт болно 12/16/2015Vanderbilt university
  • 34.
  • 35.
  • 36.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 3612/16/2015Vanderbilt university
  • 37.
     Заагч дээрарифметик үйлдэл хийж болно ◦ Заагчийг нэмэгдүүлэх/хорогдуулах (++ эсвэл --) ◦ Заагч дээр бүхэл тоо нэмэх (+ эсвэл +=, - эсвэл -=) ◦ Заагчуудыг бие биенээс нь хасч болно ◦ Эдгээр үйлдлүүдийг хүснэгт дээр хийх үед л утгатай байна 3712/16/2015Vanderbilt university
  • 38.
     Бүхэл тоонтөрөл нь 4 байт байдаг машин дээрх 5 элементтэй хүснэгт ◦ vPtr эхний элемент v[0] рүү заана  3000 гэсэн байрлал руу (vPtr=3000) ◦ vPtr+=2; vPtr-ийг 3008 утгатай болгоно  vPtr нь v[2] руу заах (2-оор нэмэгдсэний дараа) ба, машин 4 байтын int төрөлтэй тул зааж буй хаяг нь 3008 болно. 38v хүснэгт ба түүн рүү заах vPtr заагч 12/16/2015Vanderbilt university
  • 39.
  • 40.
     Заагчийг хасах ◦Нэг заагчаас нөгөөг хүртлэх элементийн тоог буцаана. Хэрэв vPtr2 = v[2]; vPtr0 = v[0]; ◦ vPtr2 – vPtr0 нь 2 болно  Заагчийг харьцуулах ◦ Аль заагч нь илүү их дугаартай хүснэгтийн элемент зааж байгааг олох ◦ Заагчийн утга 0-тэй тэнцүү эсэхийг шалгах 4012/16/2015Vanderbilt university
  • 41.
     Ижил төрлийнзаагчдын хооронд утга олгох үйлдэл хэрэглэж болно ◦ Хэрэв төрөл нь ялгаатай бол төрөл хувиргах үйлдэл хэрэглэнэ ◦ Онцгой тохиолдол: void төрлийн заагч (void * төрөл)  Ерөнхий заагч, ямар ч төрлийг зааж чадна  void заагч руу шилжүүлэхэд төрөл хувиргалт хэрэггүй  void төрлийн заагч дээр шууд бус хаяглалтыг хийж болохгүй 4112/16/2015Vanderbilt university
  • 42.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 4212/16/2015Vanderbilt university
  • 43.
     Заагч бахүснэгт нь нягт холбоотой ◦ Хүснэгтийн нэр нь тогтмол заагч юм ◦ Заагчаар хүснэгтийн индексийн үйлдлийг хийж болно  b[5] хүснэгт ба bPtr заагч зарлая ◦ Тэдгээрийг ижил болгохын тулд дараах үйлдлийг хийнэ bPtr = b;  Хүснэгтийн нэр (b) нь b[5] хүснэгтийн эхний элементийн хаяг юм bPtr = &b[0];  bPtr заагчид b хүснэгтийн эхний элементийн хаягийг олгоно 4312/16/2015Vanderbilt university
  • 44.
     b[3] элемент ◦*(bPtr+3) гэж хандаж болно  Шилжилтийн утга n-ийн хувьд заагч/шилжилтийн тэмдэглэгээ гэж нэрлэгддэг ◦ bPtr[3] гэж хандаж болно  Заагч/индексийн тэмдэглэгээ гэж нэрлэгддэг  bPtr[3] нь b[3] –тай адил ◦ Хүснэгт дээрээ заагчийн арифметикийг хэрэглэн *(b+3) гэж хандаж болно 4412/16/2015Vanderbilt university
  • 45.
  • 46.
    46 Заагчийн индекс тэмдэглэгээ Заагчийншилжилттэй тэмдэглэгээ 12/16/2015Vanderbilt university
  • 47.
  • 48.
  • 49.
    49 for давталтын нөхцөлдотор үйлдэл гүйцэтгэж байна 12/16/2015Vanderbilt university
  • 50.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 5012/16/2015Vanderbilt university
  • 51.
     Хүснэгт ньзаагчуудыг агуулж болно  Жишээ: Тэмдэгт мөр төрлийн хүснэгт ◦ char *suit[ 4 ] = { "Hearts", "Diamonds”, "Clubs", "Spades" }; ◦ Тэмдэгт мөр нь эхний үсгийнхээ заагч юм ◦ char * - suit-ийн элемент бүр нь char төрлийн заагч юм ◦ Тэмдэгт мөрүүд нь suit хүснэгтэд хадгалагдахгүй ба тэнд тэдний зөвхөн заагчдыг хадгална ◦ suit хүснэгт нь тогтмол хэмжээтэй ба харин тэмдэгт мөрүүд нь ямар ч хэмжээтэй байж болно 5112/16/2015Vanderbilt university
  • 52.
  • 53.
     Заагч хувьсагчийгзарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 5312/16/2015Vanderbilt university
  • 54.
     Функцийн заагч ◦Функцийн хаягийг заана ◦ Хүснэгтийн нэр эхний элементийнхээ хаяг байдагтай адил ◦ Функцийн нэр нь функцийг тодорхойлсон кодын эхлэлийн хаяг байна  Функцийн заагч дээр дараах үйлдлүүдийг хийж болно ◦ Функц руу дамжуулах ◦ Хүснэгтэнд хадгалах ◦ Өөр функцийн заагчид олгох 5412/16/2015Vanderbilt university
  • 55.
     Жишээ: bubblesort ◦bubble функц аргументаар функцийн заагч авна  bubble тэр туслах функцийг дуудна  энэ нь өсөх эсвэл буурахаар эрэмбэлэхийг тодорхойлно ◦ bubble функцийн аргумент болох функцийн заагч: int ( *compare )( int a, int b ); нь bubble-д хоѐр бүхэл тоон аргументтай, бүхэл тоо буцаадаг функц орж ирэхийг заана ◦ Хэрэв хаалтуудыг орхивол: int *compare( int a, int b );  хоѐр int аргументтай, int-ийн заагч буцаадаг функц гэж тодорхойлогдоно 5512/16/2015Vanderbilt university
  • 56.
    56 bubble функц аргументаараа функцийн заагчавч байна 12/16/2015Vanderbilt university
  • 57.
    57 Хэрэглэгчийн сонголтоос хамааран bubbleфункц ascending эсвэл descending функцийг хүснэгт эрэмбэлэхэд ашиглаж байна 12/16/2015Vanderbilt university
  • 58.
    58 Програм юуг эрэмбэлэгдээгүй байнагэж үзэх нь bubble руу ямар функцийн заагч дамжуулагдсанаас хамаарна 12/16/2015Vanderbilt university
  • 59.
    59 bubble функц рууascending функцийг дамжуулахад програмын энэ хэсэгт ирнэ bubble функц руу descending функцийг дамжуулахад програмын энэ хэсэгт ирнэ 12/16/2015Vanderbilt university
  • 60.
  • 61.
     Заагч: өгөгдлийнтөрөл * заагч хувьсагчийн нэр (%p, арван зургаатын бүхэл тоо)  Утгаар дуудах (өөрчлөхгүй) ба хаягаар дуудах (өөрчилнө)  const тодорхойлогч нь хувьсагчийг өөрчлөхгүй байхыг заана (дөрвөн хувилбар)  sizeof нь хэмжээг байтаар тодорхойлно  Заагчийн хүснэгт  Функцийн заагч: функцийн нэр нь хаяг байдаг 6112/16/2015Vanderbilt university