Theory
C નો સૌથી ડરામણો શબ્દ
કોઈ પણ senior ને C વિશે પૂછો અને એક શબ્દ એમને નિસાસો નાખવા મજબૂર કરે છે: pointers.
આ lesson જે સત્ય પર ટકેલો છે એ આ છે: તમે પહેલેથી pointers વાપરી ચૂક્યા છો. દર વખતે જ્યારે તમે scanf("%d", &marks) લખ્યું, એ & એ scanf ને એક address આપ્યો, અને scanf એ એના દ્વારા પહોંચાડ્યું.
Pointer બસ એ idea ને એક variable બનાવી દે છે: એક box જે એ store કરે છે કે બીજો box ક્યાં રહે છે. એક ચિત્ર, બે operators, અને ડર ઓગળી જાય છે.
Theory
ઘર અને સરનામાની ચબરખી
તમારું ઘર એક variable છે: એમાં વસ્તુઓ હોય છે (એની value). હવે તમારા ઘરનું સરનામું એક કાગળની ચબરખી પર લખો. ચબરખી એ pointer છે: એમાં તમારું ફર્નિચર નથી હોતું, એમાં હોય છે એને ક્યાં શોધવું. ચબરખી કોઈ courier ને આપી દો અને એ તમે ઘરે ન હો તોય એની અંદર delivery કરી શકે છે. બે સવાલ મહત્વના છે: "તમારું સરનામું શું છે?" (&) અને "આ સરનામા પર શું છે?" (\*).
Theory
Pointers, ઔપચારિક રીતે
દરેક variable એક numbered memory address પર રહે છે (એ જ addresses જે BCA103 ની address bus વહન કરે છે).
int marks = 78; /* lives at, say, address 5000 */
int *p; /* p is a POINTER to an int */
p = &marks; /* p now holds 5000 */
- & (address-of):
&marksપૂછે છે "marks ક્યાં રહે છે?" → 5000. - *\ (dereference)*: `p` પૂછે છે "p ની અંદરના address પર શું રહે છે?" → 78.
Declaration ને મોટેથી વાંચો: int *p = "p એક int ને point કરે છે". p ની VALUE એક address છે; *p એ address પરની value છે.
Practical
દૂરથી કરેલું કામ
#include <stdio.h>
int main() {
int marks = 78;
int *p = &marks;
printf("marks = %d\n", marks);
printf("*p = %d\n", *p);
*p = 99; /* write THROUGH the pointer */
printf("marks is now %d\n", marks);
return 0;
}This example runs in Gri-Learn on the web, where you can edit it and see the output.
Think first
Output નું અનુમાન કરો
Code ચલાવો: p, marks નો address રાખે છે, પછી *p = 99 એના દ્વારા લખે છે. ત્રણ print થતી lines શું છે?
Show the answer
marks = 78
*p = 78
marks is now 99
ત્રીજી line એ જ આખો lesson છે: *\p માં લખવાથી marks પોતે બદલાઈ ગયો*, કારણ કે p અને marks એક જ box છે જ્યાં બે રસ્તે પહોંચાય છે. કંઈ copy ન થયું; pointer એ રસ્તો છે, નકલ નહીં. આ દૂરથી-કરેલું-કામ એ જ pointers ના હોવાનું કારણ છે.
Quiz
int marks = 78; int *p = &marks; variable p ની અંદર શું store થાય છે?
- marks નો memory address
- value 78
- marks ની એક copy જે આપોઆપ update થાય છે
- "marks" નામ, text તરીકે
Show the answer
marks નો memory address
Pointer ની content એક address જ હોય છે, બીજું કંઈ નહીં: p રાખે છે કે marks ક્યાં રહે છે, નહીં કે એ શું રાખે છે. Value 78 એ છે જે તમને DEREFERENCE (*p) કરવાથી મળે છે. જે students 78 જવાબ આપે છે એ ચબરખી ને ઘર સાથે ભેળવી દે છે, બરાબર એ જ ગૂંચવણ જેને રોકવા માટે આ analogy છે.
Quiz
આ unit ના ખુલાસા પછી, scanf ને સાદા marks ને બદલે &marks ની જરૂર કેમ છે?
- scanf ને input સાચા box માં પહોંચાડવા માટે ADDRESS ખબર હોવો જોઈએ
- & થી scanf ઝડપી ચાલે છે
- એ ફક્ત એક naming convention છે, કોઈ અર્થ નહીં
- & પહેલાં marks ને string માં ફેરવે છે
Show the answer
scanf ને input સાચા box માં પહોંચાડવા માટે ADDRESS ખબર હોવો જોઈએ
scanf તમારા variable માં કોઈ બીજા function ની અંદરથી લખે છે, અને caller ના box સુધી પહોંચવાનો એકમાત્ર રસ્તો એનો address છે, બરાબર ચબરખી વાળો courier. સાદું marks, scanf ને 78 ની copy આપી દેત, delivery માટે નકામી. Unit 1 નો રહસ્યમય & ખરેખર શરૂઆતથી એક pointer હતો.
Watch out
Marks ક્યાં કપાય છે
બંને operators ને ભેળવી દેવા: & એક address આપે છે, એકને follow કરે છે; traces માં દરેક step ને "address" કે "value" label કરો. ખોટું declare કરવું: `int p એક pointer declare કરે છે; પછી, સાદું p એ address છે અને p` એ value છે, બે ભૂમિકા ભજવે છે (declaration સામે dereference) અને exams બરાબર આ જ test કરે છે. લટકતા asterisk વાળી વિચારસરણી: p માં "marks" નથી હોતું, એમાં marks નો ADDRESS હોય છે. અહીં ભાષાની ચોકસાઈ marks અપાવે છે.
Theory
C આ તાકાત કેમ રાખે છે
Pointers, functions ને તમારા variables બદલવા દે છે (pass by reference, Unit 4), programs ને arrays પર ઝડપથી ચાલવા દે છે (array નું નામ છાનેમાને એક address છે, બે lessons આગળ), અને પછી, Sem 3 માં, data structures ને runtime પર વધવા દે છે. દરેક senior જેણે નિસાસો નાખ્યો, એણે આ જ topic પર પોતાના interviews પણ જીત્યા. આગળ: વ્યવહારુ drill, દરેક type ના pointers declare અને initialize કરવા.
Summary
Key takeaways
- દરેક variable એક memory address પર રહે છે; pointer એક variable છે જે ADDRESS store કરે છે.
- & = address-of (એ ક્યાં રહે છે?); * = dereference (ત્યાં શું રહે છે?).
- int p = &marks: p, marks નો address રાખે છે; p બીજા રસ્તે marks ની value છે.
- *p = 99 marks ને પોતે બદલી નાખે છે, દૂરથી કરેલું કામ.
- scanf નો & આખરે સમજાયો: delivery માટે address જોઈએ.
- યાદ રાખવાની યુક્તિ: ઘર (variable) અને સરનામાની ચબરખી (pointer).