COMPINFO - კომპიუტერული ინფორმაცია - სტატიები » პროგრამირება » მაჩვენებელი მატრიცას სრულად ფლობს

http://compinfo.ge/index.php?type=preview&area=1&p=articles&id=18


ადგილმდებარეობა  მთავარი » სტატიები » პროგრამირება
მაჩვენებელი მატრიცას სრულად ფლობს

 მაშ, განვაგრძოთ CompInfo-ს 23-ე ნომერში დაწყებული ამბავი მაჩვენებლების შესახებ.

       რა ხდება შემდეგ. . .

       მორიგი კითხვა რაც გაჩნდება მაჩვენებლების რაობაზე ეს არის ის თუ როგორ გამოიყურებიან ისინი პროგრამულ კოდში ანუ როგორ წარმოიშვებიან ისინი და რისი მაქნისები არიან მატრიცას სამყაროში.

       რამდენადაც მკითხველისთვის ცნობილია C/C++-ში ცვლადის დეკლარაცია ხდება შენდეგნაირად:

       int     i;

       ან

       double    x, y, z;

       დაახლოებით ასევე აღიწერება მაჩვენებელი:

       int    *j;

       ან

       double     *h,*k;

       როგორც უკვე შენიშნეთ ჩვეულებრივი ცვლადის აღწერისაგან მაჩვენებლის აღწერა განსხვავდება იმით რომ მას წინ უძღვის ვარსკვლავი, რაც სწორედ იმას მიუთითებს რომ ის არ არის ჩვეულებრივი ცვლადი და მასზე ვერ ჩავატარებთ იგივე ტიპის ოპერაციებს რასაც ჩვეულებრივ ცვლადზე, მაგალითად ზემოთ მოყვანილი აღწერების გათვალისწინებით, ჩანაწერი:

       x = 23.67;    //დასაშვებია

       მაგრამ

       h = 23.67;    // შეცდომაა

       უფრო ზუსტად: ჩანაწერი int *j; ნიშნავს იმას, რომ გვაქვს აღწერილი მაჩვენებელი მთელი ტიპის ცვლადზე ანუ j-ს შეიძლება მიენიჭოს არა უბრალოდ რაიმე მთელი რიცხვი არამედ ისეთი ცვლადის მისამართი რომელიც თვითონ არის მთელი ტიპის.

       პირდაპირ გეტყვით, რომ ყველა იმ კითხვიდან რომელიც ამ უკანასკნელი წინადადების წაკითხვისას გაგიჩნდებათ მნიშვნელოვანია შემდეგი:

       - “კი, მაგრამ, ეს მისამართი რაღა ჯანდაბაა და საიდან მოვიტანო?”

       (დანარჩენი კითხვები კი დროებით “რესაიკლში” შევინახოთ). . . . Image at : www.g3b.ge

       . . . . ჰოდა, აი აქ მიუთითა მან "ორაკულზე":

       - “პროგრამისტი ხარ?” - ჰკითხა მას ნეომ.

       - . . . .  Image at : www.g3b.ge 

       - “აბა ვინ ხარ?” - რეჰკითხა ნეომ.

      - “მე ვიცავ ყველაზე მთავრებს!. . . ” - იყო პასუხი.

Iamge at : www.g3b.ge

სერიფისა რა მოგახსენოთ მაგრამ აი ჩვენ კი დიდი ყურადღება გვმართებს მაჩვენებლებთან მუშაობის დროს; მთელი ფილოსოფია მაჩვენებლებისა და მისამართებისა იმაში მდგომარეობს რომ ჩვენს სწორად უნდა მივიღოთ მეხსიერების მისამართი, წინააღმდეგ შემთხვევაში შეიძლება გამოუსწორებელი ზიანი მივაყენოთ სისტემას, ანუ დაუკითხავად შევიჭრათ მატრიცის აკრძარულ სამყაროებში სადაც მკვიდრობს თვით დიადი Windows-ი.

       თუ როგორ დავიცვათ თავი მსგავსი ფატალური შეცდომებისგან ამისათვის უნდა კარგად გავერკიოთ შემდეგ კოდში:

       int   i;

       int   *j;

       i = 10;

       j = &i;

       cout << i << endl;

       cout << *j << endl;

       აქ ბოლო ორი ბრძანება დაწერს ერთი და იგივე რიცხვს - 10-ს. რატომ? იმიტომ რომ, რომ j -ში ინახება i-ს მისამართი და როდესაც მივმართავთ j-ს იგი თავის მხრივ მიმართავს i-ს და იქიდან იღებს მნიშვნელბას. სქემატურად ეს პროცესი ასე შეიძლება წარმოვიდგინოთ:

      

Iamge at : www.g3b.ge

       სადაც 0xFF3E არის მეხსიერების უჯრედის მისამართი თექვსმეტობით წარმოდგენაში.

       და ბოლოს კიდევ რამოდენიმე მნიშვნელოვანი მომენტი.

      

   1   


       აღწერები:

       int*   j,k;

       და

       int *j,*k;

       ერთიდა იგივე არ არის. თუმცა ორივე ჩანაწერი სრულიად კორექტულია.

       პირველი იგივეა რაც

       int *j;     int k;

       ხოლო მეორე კი

       int *j;     int *k;

      

   2   


       მაჩვენებელს კოდის ნებისმიერ ადგილას შეგვიძლია მივანიჭოთ ნებისმიერი ცვლადის მისამართი, ოღონდ ცხადია, რომ როგორც აღვნიშნეთ მაჩვენებლის და ცვლადის ტიპი ერთმანეთს უნდა ემთხვეოდეს:

       double   x;

       int   i;

       int   k;

       int   *j;

       j = &i;

       j = &k;

       j = &x;    //-შეცდომაა

       მაჩვენებლებზე კიდევ ბევრია სალაპარაკო, რასაც შემდგომ სტატიებში განვაგრძობთ.

       ვნახავთ კიდევ რა შეუძლიათ მათ და საერთოდ რა საჭიროა სხვისი მისამართების ცოდნა. . . 

       ამჯერად კი სულ ეს იყო. . .


რეზიუმე

რეზიუმე ბოლოს!  Iamge at : www.g3b.ge 

 ავტორი: გიორგი ბაწაშვილი(G3B)

  
ინფორმაცია


თემატური სტატიები






გამოხმაურება

აღდგენილია სტატიის საწყისი ვარიანტი
07-02-2010, 12:46:05 | G3B

იქნება C# საწავლებელი დადოთ
14-04-2009, 11:50:42 | general_simus


კომენტარის დატოვება
თქვენ არ შეგიძლიათ კომენტარების დატოვება.