نشانگرها و آرایه ها در زبان C

همچنین می توانید از نشانگرها برای دسترسی به آرایه ها استفاده کنید.

به آرایه اعداد صحیح زیر توجه کنید.

int myNumbers[4] = {25, 50, 75, 100};

در فصل آرایه ها آموختیم، چگونه عناصر یک آرایه را با حلقه for فراخوانی کنیم.


int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", myNumbers[i]);
}

حالا بجای چاپ مقدار هر عنصر آرایه، آدرس حافظه هر عنصر را چاپ می کنیم.


int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%p\n", &myNumbers[i]);
}

اگر به خروجی مثال قبل دقت کرده باشید متوجه عدد آخر آدرس های نمایش داده شده می شوید، که هر کدام با اختلاف 4 رقم از هم جدا شده اند.

به همین دلیل است که اندازه یک نوع داده از جنس ( int ) معمولاً 4 بایت است.


int myInt;

printf("%lu", sizeof(myInt));

بنابر این از مثال بالا متوجه شدیم که کامپایلر (compiler)، برای هر عنصر از آرایه مقدار 4 بایت حافظه ذخیره می کند.

یعنی کل آرایه 16 بایت (4 عنصر و هر کدام 4 بایت) از حافظه را اشغال می کند.


int myNumbers[4] = {25, 50, 75, 100};

printf("%lu", sizeof(myNumbers));

نحو ارتباط نشانگرها و آرایه ها در زبان C

در زبان C، نام یک آرایه، نشانگر اولین عنصر آرایه است.

حتماً کمی سردرگم شده اید، بیایید برای درک بهتر از مثال آدرس حافظه بالا استفاده کنیم.

آدرس حافظه عنصر اول با نام آرایه یکسان است.

int myNumbers[4] = {25, 50, 75, 100};

// آدرس حافظه آرایه myNumbers را گرفتیم
printf("%p\n", myNumbers);

// آدرس حافظه عضو اول آرایه myNumbers را گرفتیم
printf("%p\n", &myNumbers[0]);

به این معنی است، که می توانیم با آرایه ها از طریق نشانگرها کار کنیم.

از آنجایی که متغیر myNumbers به عنصر اول آرایه اشاره می کند، می توان از عملگر ( * ) برای دسترسی به آن استفاده کرد.

int myNumbers[4] = {25, 50, 75, 100};
  
// مقدار داده عضو اول آرایه myNumbers را گرفتیم
printf("%d", *myNumbers);

همچنین برای دسترسی به سایر عناصر آرایه می توانید، نشانگر آرایه را مانند ماثل زیر افزایش دهید (... ,+2 ,+1).

int myNumbers[4] = {25, 50, 75, 100};

// مقدار داده عضو دوم آرایه myNumbers را گرفتیم
printf("%d\n", *(myNumbers + 1));

// مقدار داده عضو سوم آرایه myNumbers را گرفتیم
printf("%d", *(myNumbers + 2));

یا برای فراخوانی عناصر، از حلقه for استفاده کنید.

int myNumbers[4] = {25, 50, 75, 100};
int *ptr = myNumbers;
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", *(ptr + i));
}

البته می توان مقدار عناصر آرایه را با نشانگرها تغییر داد.

int myNumbers[4] = {25, 50, 75, 100};

// مقدار داده عضو اول آرایه را به عدد 13 تغییر دادیم
*myNumbers = 13;

// مقدار داده عضو دوم آرایه را به عدد 17 تغییر دادیم
*(myNumbers +1) = 17;

// مقدار داده عضو اول آرایه را گرفتیم
printf("%d\n", *myNumbers);

// مقدار داده عضو دوم آرایه را گرفتیم
printf("%d\n", *(myNumbers + 1));

شاید برای آرایه های کوچکی مانند مثال بالا استفاده از نشانگرها زیاد منطقی نباشد، اما در پروژه های عملی و بزرگ این روش بسیار کارآمد است.

همچنین در اینجا آموختیم، چگونه به آرایه های دو بعدی بصورت سریع و آسان دسترسی پیدا کنیم.

و از آنجایی که رشته ها یک آرایه هستند، می توانید از نشانگرها برای دسترسی به عناصر آن استفاده کنید.

هدف از این بخش صرفاً آموزش روش کار نشانگرها در زبان C می باشد، البته به یاد داشته باشید که کار با نشانگرها بسیار حساس بوده و امکان باز نویسی سایر داده های ذخیره شده در حافظه وجود دارد.

توصیه

هیچ آموزشی بدون تمرین و تکرار در ذهن نمی ماند.

بعد از اتمام این دوره، سعی کنید برنامه های کوچک خود را طراحی و سپس کد آن را بنویسید.

قطعاً در ابتدای کار با خطاهای مختلفی روبرو خواهید شد، اما لطفا نا امید نشوید چرا که همین خطاها باعث کسب تجربه، فهم بیشتر و از همه مهمتر، یادگیری عمیق مطالب خواهد شد.

 

توصیه طلایی : تمرین ، تمرین ، تمرین ، کد نویسی ، کد نویسی و کد نویسی

 

توسعه دهندگان
امین آهن کوبی