მთავარი  |    ფორუმი  |    FAQ  |    წესები  |    რეკლამა ჩვენთან  |    კონტაქტი  |    რუქა






ადგილმდებარეობა  მთავარი » სტატიები » პროგრამირება
გადატვირთვა

მაშ, დავამთავროთ ისტორია მატრიცას შესახებ, რომელიც დავიწყეთ Compinfo-ს წინა სტატიებში.     მოდით ბევრი აღარ გავაგრძელოთ და მოვიყვანოთ ერთი ტიპიური მაგალითი მაჩვენებლებზე(pointer) (გაანალიზების მიზნით სტრიქონებს დავნომრავ):

1.     int i, *p;
2.     i = 50;
3.     p=&i;
4.     *p=55;

    პირველ სტრიქონში აღწერილია ჩვეულებრივი ცვლადი, რომელიც არის int ტიპის და მაჩვენებელი - p, რომელსაც შეუძლია მიმართოს int ტიპის ცვლადზე. მეორე სტრიქონში კი ხდება ჩვეულებრივი მინიჭება, ანუ i იღებს 50-ის ტოლ მნიშვნელობას. მნიშვნელოვანია მესამე სტრიქონი. აქ სიმბოლოს & ეწოდება მიმმართველი (reference). მისი დანიშნულება არის ის რომ p მაჩვენებელს მიანიჭოს i ცვლადის მისამართი. (ვიმეორებ რომ i და p არიან ერთი და იგივე ტიპის – ეს მნიშვნელოვანია).     ახლა ცოტა ხანს თავი დავანებოთ მე-4 სტრიქონს და განვიხილოთ ზემოთქმული. თუ ჩვენ დავწერთ ასეთ კოდს:

cout << i << endl;
cout << *p << endl;

    პროგრამა გამოიტანს მნიშვნელობებს:

50
50

    გასაგებია: წარმოიდგინეთ დიდი ცათამბჯენი, რომლის თითოეულ ოთახს აქვს თავისი ნომერი. დავუშვათ 795-ე ოთახში არის ბიძია i, ხოლო რომელიღაც ოთახში კი ბიძია p. ოპერაცია p=&i; ნიშნავს იმას, რომ ბიძია p-ს ვუთხარით, რომ ბიძია i იმყოფება 795-ე ოთახშიო. შემდეგ როდესაც დავწერეთ ინფორმაციის გამოტანის კოდები, პირველი სტრიქონით ჩვენ მივუთითეთ ბიძია i-ს რომ გამოიტანოს გარეთ ის რაც მის ოთახშია, ხოლო *p-ით კი ვუთხარით ბიძია p-ს რომ გამოიტანოს იმ ოთახის შიგთავსი რომლის მისამართიც უთხრეს მას. ასე რომ ორივე სტრიქონი დაგვიწერს ერთი და იგივე პასუხს.     ახლა უკვე გასაგებია თუ რა მოხდება მე-4 სტრიქონის შესრულების დროს *p=55; ეს იგივეა რაც i=55; ოღონდ მხოლოდ იმის შემდეგ რაც შესრულებულია მე-3 სტრიქონი. წინააღმდეგ შემთხვევაში საქმე გვექნება ფატალურ შეცდომასთან: ანუ ბიძია p-ს ვაძლევთ ოთახის შიგთავს და არ ვეუბნევით თუ რომელ ოთახში უნდა შეინახოს ის, ისიც იძულებულია მიადგეს შემთხვევით ოთახს.     ასე რომ სერიფი წარმოადგენდა ჭეშმარიტ მაჩვენებელს ორაკულზე. სხვა შემთხვევაში ის პირდაპირ იმ ოთახს ვერ მიადგებოდა

Image at : www.g3b.ge 

    ახლა კი “გავიმეოროთ” ნეოსა და ორაკულის დიალოგის დასაწყისი:

Image at : www.g3b.ge 

. . .
C/C++ : მოდით არ გვინდა საუბარი ამინდზე . . .
თქვენ : შენ ადამიანი არ ხარ, არა?
C/C++ : ნუთუ ამაზე ცხადი არის კიდევ რამე ამ ქვეყნად?
თქვენ : თუ ჩემი აზრი გაინტერესებს, შენ ხარ მაქანების სრულად მართვის სისტემა. . . და ასევე მაჩვენებელიც.
C/C++ : დასაწყისისათვის არა უშავს . . .
თქვენ : თუ ეს ასეა, მაშინ მაჩვენებელი სისტემის სრულუფლებიანი ნაწილია – მექანიზმის ერთ-ერთი ძირითადი დეტალი. არა?
C/C++ : მერე . . .
თქვენ : ახლა კი ყველაზე ლოგიკური კითხვა: თუ კი არსებობს ჩვეულებრივი ცვლადი და მასთან შეიძლება ვიმუშავოთ მარტივად და ნორმალურად მაშინ რაღა საჭიროა მაჩვენებლების არსებობა? რატომ არიან ისინი ასე საჭირო. ხომ არაფერს მატყუებ? . . .
C/C++ : ყოჩაღ! მართალი ხარ! ნამდვილი ჯეკპოტია!
. . .

    ორაკულისა რა მოგახსენოთ, მაგრამ C/C++-ს რომ მართლა ჰქონდეს ენა გეტყოდათ, რომ საკმაოდ ბევრი მიზეზი არსებობს მის სხეულში მაჩვენებლების არსებობისათვის და ისინი მდგომარეობს შემდეგში (საერთოდ კი C++ ამ ამბავში C-მ გაქაჩა   ).     პირველი მაგალითად ის, რომ თითქმის ყველა ოპერანდი ჯერ მაჩვენებლებში გარდაიქმნება და შემდეგ ისე ურთიერთქმედებენ მეხსიერებასთან და რეგისტრებთან. ასე რომ მაჩვენებლებთან მუშაობა ყოველ შემთხვევაში თეორიულად მაინც აჩქარებს პროგრამის შესრულებას; საერთოდ კომპილატორი მუშაობს მაჩვენებლური სტილით.     მეორე კი ის რომ მაჩვენებლების საშუალებით შეგვიძლია მივუდგეთ მეხსიერების ნებისმიერ ნაწილს, ძალიან მარტივად, ვიცით რა რომ მაჩვენებლებისათვის სამართლიანია არითმეტიკული ოპერატორების გამოყენება. მაგალითად:     გვაქვს შემდეგი აღწერა:

1.     int arr[20];
2.     int *p1, *p2;
3.     p2=arr;
4.     p1=p2;

    (აქ უნდა აღვნიშნოთ, რომ მე-3 სტრიქონში არ გამოვიყენე & ოპერატორი (წესით უნდა ყოფილიყო ასე: p2=&arr;) საქმე იმაშია რომ arr – ანუ მასივის სახელი თვითონ წარმოადგენს მაჩვენებელს, ამიტომ p2=arr; მინიჭება სრულიად მართებულია.)     ასე რომ ზემოთ მოყვანილი კოდისათვის სამართლიანია შემდეგი:
    p1++; - ამის შემდეგ ჩვენ მივუდგებით მასივის მეორე ელემენტს
    p1--; - ამის შემდეგ ჩვენ მივუდგებით წინა ელემენტს
    p1+3; - ამის შემდეგ ჩვენ მივუდგებით p1-დან მესამე ელემენტს;
    და ა.შ.
    ასევე მაჩვენებლებისათვის შეგვიძლია გამოვიყენოთ: ==, !=, <, <=, >, >= ოპერატორები.     არსებობს მაგალითად ასეთი რთული აღმწერებიც:     int *(* comp[10]) ();     იშიფრება ასე: აღწერილია ცვლადი comp, როგორც ფუნქციაზე მაჩვენებლების მასივი, ფუნქცია კი აბრუნებს მაჩვენებელს მთელი ტიპის მნიშვნელობაზე.     კიდევ ერთი მაგალითი:

თუ გვაქვს
int arr[25], *p;
p=arr;
მაშინ შემდეგი ინსტრუქციები იდენტურებია:
arr[7], 7[arr], *(arr+7), p[7], *(p+7).

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

    მაჩვენებლების შესახებ დაწვრილებით შეგიძლიათ იხილოთ ასევე ამ მისამართზე.

    აბა მაგრად. . .

რეზიუმე

პირობისამებრ, Pascal-ზე აღარაფერი გითხარით,
მაჩვენებლების გარჩევა საკამრისია C-შია,
იქ რა იქნება ახალი? გადახედეთ და მითხარით,
პროგრამირების ენებში C pointer-თა ჯიშია.

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

  
ინფორმაცია


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




სტატიის შეფასება
ეს გვერდი უკვე შეაფასეს!

შეფასება: 4
შეფასება: 1.3



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

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

ადმინ შენთვის არავის უთქვამს რო მაგარი კაცი ხარ?
31-01-2010, 12:38:19 | StR0Ng

კარგი სტატიაა გაგრამ უფრო თვალსაჩინო რომ იყის უფრო გასაგები იქნებოდა
01-07-2009, 10:26:47 | lasha89

თუ c++ ქართულ ენაზეც გამოუშვებთ კარგი იქნება, ან კიდევ ესკოს
04-11-2007, 13:09:45 | alexsandre20

ერთი წიგნი გვაჩუქეთ შედარებით ნაკლებგანათლებულებს რაააააააა.......
25-04-2007, 11:57:08 | xokaido

ერთი წიგნი პროგამირებაზე ქართულად არ გვაწყენდა
09-11-2006, 23:47:53 | kukuruku

მაგრები ხართ
09-11-2006, 23:45:34 | kukuruku


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