አባል:ዔዛና
Appearance
ስለጠቋሚ ከማውራታችን በፊት ስለ ተለዋዋጭ ግራ(lvalue) እና ቀኝ(rvalue) እሴት እናውራ።
ምሳሌ x=2 የሚለው የተለዋዋጭ ድልደላ በ ሲ ተገቢ ነው። በመሆኑም x ን የግራ እሴት ስንለው 2 ትን የቀኝ እሴት እንለዋለን።
x ---> | |
የግራው እሴት(x) እራሱ ምንድነው የሚል ጥያቄ ብናነሳ፤ መልሳችን የሚሆነው የማሕደረትውስታ አድራሻ ነው።
ስለሆነም 2=x የሚለው እወጃ በ ሲ ስህተት ነው።
ምክኒያቱም የግራ እሴት የሚይዘው አድራሻ በመሆኑ ይሄም አድራሻ ፍርግሙ በሚሮጥበት ወቅት የሚታወቅ ነው።
የቀኝ እሴት በሌላ መልኩ መያዝ ከሚችላቸው እሴቶች መካከል አንዱ የ ማህደረትውስታ አድራሻ ነው።
ይሄንን አድራሻ የምንገልጽበት ምልክት የ ቀጥተኛ ያልሆነ ተለዋዋጭ ምልክት '''&''' ነው።
ለምሳሌ: x=2; /* x---> |2| */
printf("%p", &x);
ከሚለው አረፍተሃሳብ '''&x''' የ '''x''' አድራሻ ይይዛል።
አድራሻ ፍርግሙ ሲሮጥ የሚደለደል መሆኑን ለማወቅ ቀላል ፍርግም ጻፉና ደጋግማችሁ አሩጡት የ '''&x''' በያንዳንዱ ሩጫ የተለያየ ዋጋ ነው የሚያትመው።
ለዚህም ነው የግራ ዋጋ ቋሚ መሆን ወይም ፍርግሙ ከመሮጡ በፊት ዋጋ መስጠት የማይቻለው።
በሲ ይሄንን የግራ ዋጋ የሚይዝ ተለዋዋጭ ጠቋሚ ይባላል። ጠቋሚን ለማውጅ * ምልክት ከ ተለዋዋጩ በማስቀደም ማወጅ ይቻላል።
int *x;
ይሄ አረፍተሃሳብ ለ አቀናባሪያችን '''x''' የሚባለው ተለዋዋጭ የ ኢንቲጀር ነገሮችን አድራሻ መያዝ የሚችል ተለዋዋጭ ነው ብለን እየነገርነው ነው።
በዚህ ደረጃ '''x''' ጠቋሚ ተለዋዋጭ ከመሆን ባለፈ በተለየ የሚጠቁመው ምንም አድራሻ የለም።በመሆኑም ጠቋሚ ተለዋዋጮችን ጥቅም ላይ ከማዋላችን በፊት በአግባቡ የሚጠቁሙቱን ተለዋዋጭ መመደብ አለብን።አንዱ የምደባ መንገድ ሌላ ተመሳሳይ የሆነ ተለዋዋጭ አውጀን ወደተለዋዋጩ እንዲጠቁም ማድረግ ነው።
int y; /* y--->| | */
y=2; /* y--->|2 |*/
x=&y; /*x--->|addr. y| */
አሁን '''x''' የ '''y''' አድራሻን ይይዛል ማለት ነው።
የ '''x''' ን ዋጋ printf("%p\n", x); ብናትም የ ዋይን አድራሻ ይሰጠናል ማለት ነው።
በ '''x''' የተጠቆመውን ዋጋ በሁለት መንገድ ማተም እንችላለን። አንደኛው እና የተለመደው '''*x''' ሲሆነ ሌላኛው መንገድ '''*&y''' ነው። *x ከ *&y አንድ አይነት ነው። '''*x''' የግራ እሴት ነው። ስለሆነውም የግራ እሴት ላይ የቀኝ ዋጋ ማስቀመጥ ይቻላል። በመሆኑም *x =19 ብለን ብናስቀምጥ የ y ን ዋጋ አያይዞ ይቀይራል። *x=19; y--->|19| የስሌት ምልክቱን = በመጠቀም በ ቀኝ ያለውን እሴት ወደ ግራው እሴት መገልበጥ እንችላለን። ይሄን ማድረግ የምንችለው ግን ጠቋሚዎቹ ተመሳሳይ አይነት ካላቸው ነው። ለምሳሌ: int a,b,*c,*d; የሚል እወጃ ቢኖረን c=&a; የሚለው አረፍተሃሳብ ጠቋሚያችንን ይደለድልልናል። ማለትም የ a አድራሻ c ላይ ይገለበጣል። c--->|addr.a| d=c; d--->|addr.a| ይሄ አረፍተሃሳብ የ ሲን ዋጋ(ማለትም የ ኤ አድራሻን) ዲ ላይ ይገለብጥልናል። መሆኑም ዲ እና ሲ ወደ አንድ ቦታ ይጠቁማሉ ማለት ነው። *d=2; የሚል አረፍተሃሳብ ብንጽፍ ይኼ 2 ትን ዲ ወደሚጠቁምበት ተለዋዋጭ ዋጋ ላይ ያስቀምጥልናል። በመሆኑም የ ዲም የ ሲም ዋጋ 2 ይሆናል ማለት ነው። d--->|2| c--->|2| *c = *d; የሚለው አረፍተሃሳብ ዲ የሚጠቁመውን ተለዋዋጭ ዋጋ '''(2)''' ወደ ሲ እሚጠቁምበት ላይ ይገለብጣል። c=d ; የሚለው አረፍተሃሳብ የ ዲን አድራሻ ሲላይ ይገለብጣል። በመሆኑም ሁለቱ ወደ አንድ ቦታ ይጠቁማሉ ማለት ነው። የሁለቱን ልዩነት ማስተዋል ጠቃሚ ነው።