Заагч Хичээл  8
Pointer -  Заагч Заагч  нь санах ойн хаяг хадгалах хувьсагч P  нь  C  хувьсагчийг зааж байна гэдэг C 7 3 4 … … 173 172 174 175 176 177 178 179 180 181 174 3 4 … … P 833 832 834 835 836 837 838 839 840 841
Заагч  хувьсагчийг зарлах Заагч  –г зарлахдаа   хувьсагчийн өмнө нь  *  тэмдэг бичиж өгдөг . type  * variable_name;
Заалгах &   энэ оператор нь хувьсагчийн хаягийг буцаадаг. Жишээ нь :  P = &C; C   –н хаягийг з аагч  хувьсагч   P -д оноолоо гэсэн үг. Тэгээд  P   нь   C -г зааж байна гэдэг Заагч ийг хэвлэхдээ ,  %p   формат ашиглана .
Заалгах int  C; int  *P;  /* Заагч аар зарлах  */ C = 7; P = &C; C 7 3 4 … … 173 172 174 175 176 177 178 179 180 181 174 3 4 … … P 833 832 834 835 836 837 838 839 840 841
Хаягийн дотор орох *   операторыг ашиглана. Заагчийн зааж байгаа зүйл рүү хандах боломжийг олгоно Хэлбэр нь : *P =  7 ; C  (  P  –н зааж байгаа хаяг дахь )  байгаа газар  5 -г онооно
Хаягийн дотор орох printf(“%d”, *P);  /* Prints out ‘7’ */ *P = 177; printf(“%d”, C);  /* Prints out ‘177’ */ P = 177;  /*  Энэ бол буруу шүү !! */ C 7 3 4 … … 173 172 174 175 176 177 178 179 180 181 174 3 4 … … P 833 832 834 835 836 837 838 839 840 841 177 177
Жишээ
Заагч алхам алхмаар int x=1, y=2, z[10]={5,6,7}; int *ip; /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;  /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 2 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 … 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;  /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];  /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 2 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;  /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];  /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 2 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;  /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];  /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;  /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];  /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;  /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];  /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;   /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];  /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;   /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;   /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];   /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;   /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];   /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 1 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;   /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];   /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 1 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
Заагч алхам алхмаар int  x=1, y=2, z[10]={5,6,7}; int  *ip;  /* ip  нь   з аагч int -г заана  */ ip = &x;  /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip;  /* y is now 1 */ printf("y is now %d\n",y); *ip = 0;   /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2];   /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1;  /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 1 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
Нийтлэг алдаа анхааруулга Заагч ид илэрхийлэл болон тогтмол оноож болохгүй Ямар нэг хувьсагчийн хаягийг өөрчилж болохгүй ( үүнийг бид тодорхойлохгүй !). Дараах нь алдаанууд : i = &3; j = &(k+5); k = &(a==b); &a = &b; &a = 150;
Аргументыг утгаар дамжуулах Бид энэ хүртэл функц руу аргументыг утгаар “by value”  нь дамжуулж байсан Утгаар дамжиснаар функц эх хувийг өөрчилж чаддаггүй
Буруу  Swap swap  нь хоёр хувьсагч хүлээн аваад тэгээрийн утгуудыг хооронд солих гэж байна даан ч эх хувь үл өөрчлөгдөнө . void  swap( int  x,  int  y)   { int  tmp = x; x = y; y = tmp; }
Үүнийг хэрхэн засах вэ ? Үүний тулд хаягуудыг нь хүлээн авч болно void  swap( int  *x,  int  *y)   { …  *x  ба  *y  хооронд нь  соль … } Бид одоо   swap(&x, &y)  гэж дуудах хэрэгтэй ; Энэ нь хаягаар дамжуулж байна
Swap   зөв боллоо   void  swap( int  *x,  int  *y)   {   int  tmp = *x; *x = *y; *y = tmp;   }
Scanf  –д бид юу хийгээд байв аа? scanf(“%d”, &a);  ийм бичлэгийг бид мэднэ scanf   –д бид үнэндээ хаягийг дамжуулж байсан байна ,  иймд  scanf   хувьсагчийн доторх зүйлийг өөрчилж чадаад байсан байна шүү дээ.
Дасгал Бодит тоо хүлээн аваад түүний бүхэл ба бутархай хэсгийг буцаах функц бич . Энэ функцээ ашигласан жишээ програм бич .
Заагч   ба Массив S   массивын   энхий элемент  S[0] нь түүний хаягийг хадгалж байдаг S   нь үнэндээ бол   S[0] -г заах заагч юм int  S[10]; int  *P; P=S;  /* P  ба  S  нь адил   */ P   ба   S   хоёул  S[0] -г заана
Заагч- массив   төстэй Массив бол   з аагч ийн нэг хэлбэр юм !  Массив тодорхойлогдоход санах ойн тодорхой хэсэгт зай авч байрлана .  Массив хувьсагч массивын эхлэлийг заана. Заагч ийг зарламагц анхны утгыг оноодоггүй  ( ердийн хувьсагчтай адилхан биш )
Заагч ийн  a рифметик Заагч ийг нэмэгдүүлж мөн хорогдуулж болно Хэрэв   p   нь   ямар нэг төрлийн з аагч  бол ,  p+1   нь яг ийм төрлийн дараагийн хувьсагчийн хаяг болно p++ ,   p+i ,  болон   p += i   гэж үйлдэл хийж болдог
Заагч  арифметик  - жишээ Хэрэв   p   ба   q   нь массив дахь элементүүдийг зааж байгаа бол   q-p   нь  p   ба   q  хооронд байх элементийн тоо юм . Заагчийн арифметик болон тооны арифметик хоёр нь ялгаатай зүйлүүд . Жишээ  –  ptr_arithmetic.c
Заагч ийн арифметик  strcpy void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; }
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ !’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
Strcpy – алхам алхмаар void  my_strcpy( char  *dest,  char  *src) { while  (*src != '\0') { *dest = *src; dest++; src++; }  *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ !’
Дасгал Дараах зарлалт бүхий функц бич : void  replace_char( char  *str,    char  c1,    char  c2); Энэ нь  str   мөрөнд байх  c 1  бүрийг   c2 -р солино . []  операторыг ашиглахгүй !
Бодолт char_replace.c
2D  хэмжээст массивийг функцэд дамжуулах Функц нь массивыг дараах байдлаар хүлээн авдаг  – int  func( int  arr[]); Хоёр хэмжээст массивыг  – int   func2(int  arr2D[][]);  гэж авах уу? Энэ бол алдаа !
2D  хэмжээст массивийг функцэд дамжуулах int  func2( int  arr[][4]); Хоёр хэмжээст массив нь үнэндээ массивын массив юм int  arr[3][4]  –  энэ нь дараах  3  элементтэй массив юм.   4  бүхэл тоог агуулах массив
2D  хэмжээст массивийг функцэд дамжуулах 2D  хэмжээст массивийг функцэд дамжуулахадаа хэмжээсийг нь тодорхой бичиж өгнө Энэ бол зөв зарлалт   int  func2( int  arr[3][4]); ‘ 3’  нь утга болоод өөр ямар нэг зүйлийг агуулахгүй
Дасгал MatMul  функц бич  – оролт  –A, B, C  гэсэн гурван квадрат матриц үйлдэл  – C  нь  A  ба  B  –ийн үржвэр Хоёр матрицыг хүлээн аваад тэдгээрийн үржвэрийг дэлгэцэнд хэвлэх програм бич
Solution mat_mul.c

C lects (7)

  • 1.
  • 2.
    Pointer - Заагч Заагч нь санах ойн хаяг хадгалах хувьсагч P нь C хувьсагчийг зааж байна гэдэг C 7 3 4 … … 173 172 174 175 176 177 178 179 180 181 174 3 4 … … P 833 832 834 835 836 837 838 839 840 841
  • 3.
    Заагч хувьсагчийгзарлах Заагч –г зарлахдаа хувьсагчийн өмнө нь * тэмдэг бичиж өгдөг . type * variable_name;
  • 4.
    Заалгах & энэ оператор нь хувьсагчийн хаягийг буцаадаг. Жишээ нь : P = &C; C –н хаягийг з аагч хувьсагч P -д оноолоо гэсэн үг. Тэгээд P нь C -г зааж байна гэдэг Заагч ийг хэвлэхдээ , %p формат ашиглана .
  • 5.
    Заалгах int C; int *P; /* Заагч аар зарлах */ C = 7; P = &C; C 7 3 4 … … 173 172 174 175 176 177 178 179 180 181 174 3 4 … … P 833 832 834 835 836 837 838 839 840 841
  • 6.
    Хаягийн дотор орох* операторыг ашиглана. Заагчийн зааж байгаа зүйл рүү хандах боломжийг олгоно Хэлбэр нь : *P = 7 ; C ( P –н зааж байгаа хаяг дахь ) байгаа газар 5 -г онооно
  • 7.
    Хаягийн дотор орохprintf(“%d”, *P); /* Prints out ‘7’ */ *P = 177; printf(“%d”, C); /* Prints out ‘177’ */ P = 177; /* Энэ бол буруу шүү !! */ C 7 3 4 … … 173 172 174 175 176 177 178 179 180 181 174 3 4 … … P 833 832 834 835 836 837 838 839 840 841 177 177
  • 8.
  • 9.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 2 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 … 564 772
  • 10.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 2 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
  • 11.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 2 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
  • 12.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
  • 13.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 1 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
  • 14.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
  • 15.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 120 564 772
  • 16.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
  • 17.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 7 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
  • 18.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 1 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
  • 19.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 1 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
  • 20.
    Заагч алхам алхмаарint x=1, y=2, z[10]={5,6,7}; int *ip; /* ip нь з аагч int -г заана */ ip = &x; /* ip now points to x */ printf("ip now points to x that contains the value %d\n",*ip); y = *ip; /* y is now 1 */ printf("y is now %d\n",y); *ip = 0; /* x is now 0 */ printf("x is now %d\n",x); ip = &z[2]; /* ip now points to z[2] */ printf("ip now points to z[2] that contains the value %d\n",*ip); *ip = 1; /* z[2] is now 1 */ printf("z[2] is now %d\n", z[2]); printf("ip is %p\n", ip); x y z ip 0 1 364 5 6 1 Z[0] Z[1] Z[2] 120 248 364 368 372 372 564 772
  • 21.
    Нийтлэг алдаа анхааруулгаЗаагч ид илэрхийлэл болон тогтмол оноож болохгүй Ямар нэг хувьсагчийн хаягийг өөрчилж болохгүй ( үүнийг бид тодорхойлохгүй !). Дараах нь алдаанууд : i = &3; j = &(k+5); k = &(a==b); &a = &b; &a = 150;
  • 22.
    Аргументыг утгаар дамжуулахБид энэ хүртэл функц руу аргументыг утгаар “by value” нь дамжуулж байсан Утгаар дамжиснаар функц эх хувийг өөрчилж чаддаггүй
  • 23.
    Буруу Swapswap нь хоёр хувьсагч хүлээн аваад тэгээрийн утгуудыг хооронд солих гэж байна даан ч эх хувь үл өөрчлөгдөнө . void swap( int x, int y) { int tmp = x; x = y; y = tmp; }
  • 24.
    Үүнийг хэрхэн засахвэ ? Үүний тулд хаягуудыг нь хүлээн авч болно void swap( int *x, int *y) { … *x ба *y хооронд нь соль … } Бид одоо swap(&x, &y) гэж дуудах хэрэгтэй ; Энэ нь хаягаар дамжуулж байна
  • 25.
    Swap зөв боллоо void swap( int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; }
  • 26.
    Scanf –дбид юу хийгээд байв аа? scanf(“%d”, &a); ийм бичлэгийг бид мэднэ scanf –д бид үнэндээ хаягийг дамжуулж байсан байна , иймд scanf хувьсагчийн доторх зүйлийг өөрчилж чадаад байсан байна шүү дээ.
  • 27.
    Дасгал Бодит тоохүлээн аваад түүний бүхэл ба бутархай хэсгийг буцаах функц бич . Энэ функцээ ашигласан жишээ програм бич .
  • 28.
    Заагч ба Массив S массивын энхий элемент S[0] нь түүний хаягийг хадгалж байдаг S нь үнэндээ бол S[0] -г заах заагч юм int S[10]; int *P; P=S; /* P ба S нь адил */ P ба S хоёул S[0] -г заана
  • 29.
    Заагч- массив төстэй Массив бол з аагч ийн нэг хэлбэр юм ! Массив тодорхойлогдоход санах ойн тодорхой хэсэгт зай авч байрлана . Массив хувьсагч массивын эхлэлийг заана. Заагч ийг зарламагц анхны утгыг оноодоггүй ( ердийн хувьсагчтай адилхан биш )
  • 30.
    Заагч ийн a рифметик Заагч ийг нэмэгдүүлж мөн хорогдуулж болно Хэрэв p нь ямар нэг төрлийн з аагч бол , p+1 нь яг ийм төрлийн дараагийн хувьсагчийн хаяг болно p++ , p+i , болон p += i гэж үйлдэл хийж болдог
  • 31.
    Заагч арифметик - жишээ Хэрэв p ба q нь массив дахь элементүүдийг зааж байгаа бол q-p нь p ба q хооронд байх элементийн тоо юм . Заагчийн арифметик болон тооны арифметик хоёр нь ялгаатай зүйлүүд . Жишээ – ptr_arithmetic.c
  • 32.
    Заагч ийн арифметик strcpy void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; }
  • 33.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ !’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
  • 34.
    void my_strcpy(char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
  • 35.
    void my_strcpy(char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
  • 36.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
  • 37.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ !’ ‘ !’ ‘ !’ ‘ !’
  • 38.
    void my_strcpy(char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
  • 39.
    void my_strcpy(char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
  • 40.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
  • 41.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ !’ ‘ !’ ‘ !’
  • 42.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
  • 43.
    void my_strcpy(char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } Strcpy – алхам алхмаар ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
  • 44.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
  • 45.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ !’ ‘ !’
  • 46.
    Strcpy – алхамалхмаар void my_strcpy( char *dest, char *src) { while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; } ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ %’ src dest ‘ y’ ‘ e’ ‘ s’ ‘ \0’ ‘ !’
  • 47.
    Дасгал Дараах зарлалтбүхий функц бич : void replace_char( char *str, char c1, char c2); Энэ нь str мөрөнд байх c 1 бүрийг c2 -р солино . [] операторыг ашиглахгүй !
  • 48.
  • 49.
    2D хэмжээстмассивийг функцэд дамжуулах Функц нь массивыг дараах байдлаар хүлээн авдаг – int func( int arr[]); Хоёр хэмжээст массивыг – int func2(int arr2D[][]); гэж авах уу? Энэ бол алдаа !
  • 50.
    2D хэмжээстмассивийг функцэд дамжуулах int func2( int arr[][4]); Хоёр хэмжээст массив нь үнэндээ массивын массив юм int arr[3][4] – энэ нь дараах 3 элементтэй массив юм. 4 бүхэл тоог агуулах массив
  • 51.
    2D хэмжээстмассивийг функцэд дамжуулах 2D хэмжээст массивийг функцэд дамжуулахадаа хэмжээсийг нь тодорхой бичиж өгнө Энэ бол зөв зарлалт int func2( int arr[3][4]); ‘ 3’ нь утга болоод өөр ямар нэг зүйлийг агуулахгүй
  • 52.
    Дасгал MatMul функц бич – оролт –A, B, C гэсэн гурван квадрат матриц үйлдэл – C нь A ба B –ийн үржвэр Хоёр матрицыг хүлээн аваад тэдгээрийн үржвэрийг дэлгэцэнд хэвлэх програм бич
  • 53.