اشاره گر چیست؟
یکی از ویژگیهای قدرتمند زبان Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح میدهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C میپردازد و سی پلاس پلاسبرنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده، که این زبانها را از زبانهایی نظیر پایتونزبان برنامه نویسی پایتون چیست؟ – نحوه شروع و دلایل محبوبیتزبان برنامه نویسی پایتون (Python) چیست؟ این مقاله عالی به بررسی دلایل محبوبیت پایتون، موارد استفاده از پایتون و نحوه شروع به برنامه نویسی پایتون پرداخته، جاوا اسکریپتجاوا اسکریپت چیست؟ معرفی زبان برنامه نویسی java scriptزبان برنامه نویسی جاوا اسکریپت چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای JavaScript پرداخته و مبانی برنامه نویسی جاوا اسکریپت را آموزش داده و… متمایز میکند، اشاره گرها (Pointer) هستند. اشاره گر، نوعی از داده است که به محل ذخیره یا آدرس دادههای دیگر روی حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روشهای آدرس دهی کش، نگاشت آدرس و موارد دیگر میپردازیم اشاره میکند، یعنی اگر بخواهیم به آدرس یک متغیر از حافظه دسترسی داشته باشیم باید نوعی متغیر استفاده کنیم که اصطلاحاً اشاره گر نامیده میشود. یک اشاره گر میتواند برای ذخیره آدرس حافظه سایر متغیرها، ایجاد ساختارهای پویا که مرتبط با ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده استها میشود، توابع یا حتی اشاره گرهای دیگر استفاده شود. ایجاد و استفاده از اشاره گرها شیوهای در زبانهای C و C++ برای نزدیک کردن این زبانها به سطح پایین است. اگر این ویژگی را بلد نباشید، در استفادهی بسیاری از قابلیتهای این زبان محروم خواهید بود. در ادامه قصد داریم با جزئیات بیشتری، مفهوم اشاره گرها در برنامه نویسی را توضیح دهیم.
نحوه تعریف اشاره گرها
نحو یا Syntax ایجاد یک اشاره گر در زبان C بسیار ساده و شبیه به تعریف متغیر است، کافیست از یک عملگر (*) استفاده کنیم. بعد از علامت * فرقی ندارد که فاصله بگذاریم یا نه، بهعنوان مثال، نمونهای از ساختار تعریف Pointer در قطعه کد زیر آمده است:
datatype *ptr;
که در اینجا:
- نوع دادهای یا Datatype را باید اول مشخص کنیم. نوع داده اشاره گر با نوع داده متغیر آن باید یکی باشد.
- بخش ptr، مرتبط به نام اشاره گر است.
این نحو، برای تعریف اشاره گر به متغیر است. میتوانیم اشاره گر به توابع و ساختارها و غیره را نیز تعریف کنیم که در بخش بعد به آنها میپردازیم.
انواع اشاره گرها
اشاره گرها میتوانند به دستههای مختلفی تقسیم شوند. اگر نوع متغیر ذخیره شده در محل حافظه که توسط اشاره گر ذخیره میشود را در نظر بگیریم، اشاره گرها را میتوان به انواع زیر طبقهبندی کرد:
اشاره گر عدد صحیح (Integer Pointer)
همانطور که از نامش پیداست، اشاره گرهایی هستند که به مقادیر صحیح اشاره دارند. نحوهی تعریف آنها بدین شکل است:
int *my_ptr_variable;
end:code
یک اشاره گر میتواند به هر نوع دادهی اولیه اشاره کند؛ همچنین میتواند به انواع دادههای مشتق شده مانند آرایهآموزش آرایه در ساختمان داده به زبان ساده و از 0 تا 100در این مقاله موارد زیر بررسی شده است : 1- آرایه چیست 2- انواع اندیس گذاری در آرایه 3- انواع آرایه 4- محاسبه آدرس در آرایه 5- محاسبه شماره در آرایه 6- آرایه در برنامه نویسی 7- مزایای استفاده از آرایهها و انواع دادههای تعریف شده توسط کاربر مانند ساختارها اشاره کند.
اشاره گر ساختار (Structure Pointer)
بدین شکل تعریف میشوند و در ساختمان دادههایی نظیر لیست پیوندی و درختها، این اشاره گرها بهکار میروند:
struct struct_name *ptr;
اشاره گر آرایه (Array Pointer)
اشاره گر و آرایه ارتباط نزدیکی با یکدیگر دارند حتی نام آرایه اشاره گر به اولین عنصر آن است، آنها همچنین بهعنوان اشاره گر به آرایه شناخته میشوند. ما میتوانیم با استفاده از دستور داده شده یک اشاره گر به یک آرایه ایجاد کنیم:
char *ptr = &array_name;
اشاره گر توابع (Function Pointer)
با بقیه اشاره گرها متفاوت هستند، چون به جای اشاره به دادهها، به یک قطعه کد اشاره میکنند. نحوه تعریف آنها بدین صورت است. توجه داشته باشید نحو اشاره گرهای تابع با توجه به نمونه اولیه تابع تغییر میکند:
int (*ptr)(int, int);
اشاره گر دوتایی (Pointer to Pointer)
در زبان C، ما میتوانیم یک اشاره گر تعریف کنیم که آدرس حافظه یک اشاره گر دیگر را ذخیره کند. به این گونه اشاره گرها، دو اشاره گر یا اشاره گر به اشاره گر می گویند. آنها به جای اشاره به یک مقدار داده، به یک اشاره گر دیگر اشاره می کنند.
datatype **pointer_name;
این امکان وجود دارد که اشاره گر چندگانه (Multi-Level Pointers) نیز در زبان C ایجاد و استفاده کرد.
اشاره گر تهی (Null Pointer)
اشاره گرهای تهی، آن دسته از اشاره گرهایی هستند که به هیچ مکانی از حافظه اشاره نمیکنند. آنها را میتوان با اختصاص یک مقدار NULL به اشاره گر ایجاد کرد. به یک اشاره گر از هر نوع دادهای، میتوان مقدار NULL را اختصاص داد.
data_type *pointer_name = NULL;
or
pointer_name = NULL
اشاره گر خالی و بدون نوع دادهای (Void Pointer)
اشاره گرهای Void در C از همین نوع هستند. این بدان معنی است که آنها هیچ نوع داده مرتبطی ندارند. به آنها اشاره گرهای عمومی نیز میگویند زیرا میتوانند به هر نوع دادهای اشاره کنند و میتوانند به هر نوع دادهای تعریف شوند. یکی از ویژگیهای اصلی آنها این است که نمیتوان به آنها ارجاعی داد.
void *pointer_name;
اشاره گر بدون مقدار اولیه (Wild Pointer)
این اشاره گرها، تعریف شدهاند اما مقدار اولیهای به آنها تخصیص داده نشده است. این نوع از اشاره گرها میتوانند در برنامه ما اختلال ایجاد کنند.
int *ptr;
char *str;
اشاره گر ثابت (Constant Pointer)
در اشاره گرهای ثابت، آدرس حافظه ذخیره شده در اشاره گر، ثابت است و پس از تعریف شدن، نمیتوان آن را تغییر داد و همیشه به همان آدرس حافظه اشاره میکند.
const data_type * pointer_name;
اشاره گر به ثابت (Pointer to Constant)
اشاره گرهایی که به یک مقدار ثابت اشاره میکنند که قابل تغییر نیستند، اشاره گر به یک ثابت نامیده میشوند. در اینجا ما فقط میتوانیم به دادههای اشاره شده توسط اشاره گر دسترسی داشته باشیم، اما نمیتوانیم آن را تغییر دهیم. اگرچه، میتوانیم آدرس ذخیره شده در اشاره گر را به ثابت تغییر دهیم.
data_type * const pointer_name;
کاربرد اشاره گرها
اشاره گرها کاربردهای متعددی دارند که میتوان به موارد زیر اشاره نمود:
- دسترسی به عناصر آرایه
- تخصیص حافظه پویا
- پیادهسازی برخی از ساختمان دادهها
- برگرداندن چندین مقدار از توابع
- در برنامه نویسی سطح سیستم که آدرسهای حافظه کاربردی هستند.
- استفاده در جداول کنترل
مزایا و معایب اشاره گرها
مزایای اشاره گرها
مزایای عمده اشاره گرها در زبان C به شرح زیر است:
- اشاره گرها برای عدم تخصیص و تخصیص حافظه پویا استفاده میشوند.
- دسترسی به توابع و ساختارها و آرایهها با استفاده از اشاره گر راحتتر خواهد بود.
- برای دسترسی به مکانهای مختلف و مدنظر در حافظه کاربردی هستند.
- بهخوبی طول برنامه و زمان اجرای آن را کاهش میدهند.
- از اشاره گرها برای تشکیل ساختارهای داده پیچیده مانند لیستهای پیوندی، نمودارها، درختان و غیره استفاده میشود.
معایب اشاره گرها
با وجود این که یادگیری اشاره گرها، دست ما را برای توسعه برنامه با قابلیتهای متعدد و بهصورت راحتتر باز میکند، اما در برابر خطاها آسیبپذیر هستند و چنین معایبی را دارند:
- اگر مقدار نادرستی به اشاره گرها ارائه شود، ممکن است خرابی حافظه رخ دهد.
- اشاره گرهای بدون مقدار اولیه ممکن است باعث خطای بخشبندی در حافظه شوند.
- در مقایسه با متغیرها اندکی کندتر هستند.
- درک و یادگیری آنها اندکی پیچیده است.
- اشاره گرها عمدتاً مسئول نشت حافظه هستند.
اشتباهات متداول هنگام کار با اشاره گرها
بهصورت کلی، اگر نوع دادهای اشاره گر اشتباه تعریف شود، اشاره گر مقداردهی اولیه نشود و یا اگر اشاره گر Null باشد، خطاها و استثناهایی در برنامه ما رخ خواهد داد. یک نمونه از اشتباهات متداول هنگام کار با اشاره گرها در ادامه آورده شده است:
int c, *pc;
// Wrong! pc is address whereas, c is not an address.
pc = c;
// Wrong! *pc is the value pointed by address whereas, %amp;c is an address.
*pc = &c;
// Correct! pc is an address and, %amp;pc is also an address.
pc = &c;
// Correct! *pc is the value pointed by address and, c is also a value.
*pc = c;
از موارد بالا، دو مورد اول اشتباه و دو مورد دوم درست است.
مورد 1 اشتباه است: pc یک آدرس است در حالی که c یک آدرس نیست. پس برابر قرار دادن این دو اشتباه است.
مورد 2 اشتباه است: pc* مقداری است که در آدرسی که pc به آن اشاره میکند ذخیره شده است، در حالی که pc& یک آدرس است پس نمیتوان این دو را برابر قرار داد.
مورد 3 صحیح است: هم pc و هم c& آدرس هستند پس برابر قرار دادن آنها مشکلی ندارد.
مورد 4 صحیح است: pc* یک مقدار است و c هم یک مقدار است پس میتوان این دو را مساوی قرار داد.
مثال درباره اشاره گرها
در ادامه، قطعه کدی بهعنوان مثالی درباره اشاره گرها آمده است:
// C program to illustrate Pointers
#include <stdio.h>
void pointerexample()
{
int var = 10;
// declare pointer variable
int* ptr;
// note that data type of ptr and var must be same
ptr = &var;
// assign the address of a variable to a pointer
printf("Value at ptr = %p \n", ptr);
printf("Value at var = %d \n", var);
printf("Value at *ptr = %d \n", *ptr);
}
// Driver program
int main()
{
pointerexample();
return 0;
}
نتیجه این برنامه در خروجی بدین صورت است. در صورتی که مقدار اشاره گر بدون * چاپ شود، به آدرس حافظه اشاره میکند. اما اگر اشاره گر با متغیری مقداردهی شود و علامت * هم استفاده شود، مقدار را به ما نشان میدهد.
Value at ptr = 0x7fff1038675c
Value at var = 10
Value at *ptr = 10
جمعبندی
در این مقاله تلاش کردیم تا در مورد کاربرد اشاره گرها، انواع اشاره گرها، مزایا و معایب آن صحبت کنیم و مثالی را برای درک بهتر این موضوع به کار ببریم. بی شک یکی از مهمترین مباحث در زبان C و C++ که باید وقت بگذارید و آن را بیاموزید، اشاره گرها هستند. امیدواریم این مقاله برای شما مفید بوده باشد.
آیا یادگیری اشاره گرها در زبان C و C++ ضروری است؟
بله، اگر این مبحث را به خوبی یاد بگیرید، میتوانید از ویژگیهای این زبانها بهره ببرید. اشاره گرها مبحث اصلی و مهمی در این زبانها هستند.
یکی از مزیت های اشاره گرها پیاده سازی انواع ساختمان داده هاست، یعنی چه؟
شما به راحتی میتوانید انواع ساختمان دادههای متعارف مثل گراف، درختها، لیست پیوندی و… را با استفاده از همین مفاهیم پیادهسازی کنید.