کنکور کامپیوتر
0
ورود | ثبت نام
نظرات
اشتراک
بالا
علاقه‌مندی

اشتراک
 

اشاره گر چیست — اشاره گرها در برنامه نویسی

این صفحه عالی توضیح داده اشاره گر چیست و نحوه تعریف اشاره گرها و همین طور اشاره گرها در برنامه نویسی را بررسی کرده سپس انواع اشاره گرها و کاربرد اشاره گرها را گفته

اشاره گر چیست؟

یکی از ویژگی‌های قدرتمند زبان Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح می‌دهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C می‌پردازد و سی پلاس پلاسبرنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++‎؟برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++‎؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده، که این زبان‌ها را از زبان‌هایی نظیر پایتونزبان برنامه نویسی پایتون چیست؟ – نحوه شروع و دلایل محبوبیتزبان برنامه نویسی پایتون چیست؟ – نحوه شروع و دلایل محبوبیتزبان برنامه نویسی پایتون (Python) چیست؟ این مقاله عالی به بررسی دلایل محبوبیت پایتون، موارد استفاده از پایتون و نحوه شروع به برنامه نویسی پایتون پرداخته، جاوا اسکریپتجاوا اسکریپت چیست؟ معرفی زبان برنامه نویسی java scriptجاوا اسکریپت چیست؟ معرفی زبان برنامه نویسی java scriptزبان برنامه نویسی جاوا اسکریپت چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای JavaScript پرداخته و مبانی برنامه نویسی جاوا اسکریپت را آموزش داده و… متمایز می‌کند، اشاره گرها (Pointer) هستند. اشاره گر، نوعی از داده است که به محل ذخیره یا آدرس داده‌های دیگر روی حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوترحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روش‌های آدرس دهی کش، نگاشت آدرس و موارد دیگر می‌پردازیم اشاره می‌کند، یعنی اگر بخواهیم به آدرس یک متغیر از حافظه دسترسی داشته باشیم باید نوعی متغیر استفاده کنیم که اصطلاحاً اشاره گر نامیده می‌شود. یک اشاره گر می‌تواند برای ذخیره آدرس حافظه سایر متغیرها، ایجاد ساختارهای پویا که مرتبط با ساختمان دادهآموزش ساختمان داده و الگوریتمآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیره‌سازی و مدیریت داده‌ها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن داده‌ها را برای یکسری از الگوریتم‌ها و کاربردها فراهم می‌کند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده استها می‌شود، توابع یا حتی اشاره گرهای دیگر استفاده شود. ایجاد و استفاده از اشاره گرها شیوه‌ای در زبان‌های C و C++ برای نزدیک کردن این زبان‌ها به سطح پایین است. اگر این ویژگی را بلد نباشید، در استفاده‌ی بسیاری از قابلیت‌های این زبان محروم خواهید بود. در ادامه قصد داریم با جزئیات بیشتری، مفهوم اشاره گرها در برنامه نویسی را توضیح دهیم.

نحوه کار پوینتر یا اشاره گر در زبان برنامه نویسی C

نحوه تعریف اشاره گرها

نحو یا Syntax ایجاد یک اشاره گر در زبان C بسیار ساده و شبیه به تعریف متغیر است، کافیست از یک عملگر (*) استفاده کنیم. بعد از علامت * فرقی ندارد که فاصله بگذاریم یا نه، به‌عنوان مثال، نمونه‌ای از ساختار تعریف Pointer در قطعه کد زیر آمده است:

datatype *ptr;

که در این‌جا:

این نحو، برای تعریف اشاره گر به متغیر است. می‌توانیم اشاره گر به توابع و ساختارها و غیره را نیز تعریف کنیم که در بخش بعد به آنها می‌پردازیم.

انواع اشاره گرها

اشاره گرها می‌توانند به دسته‌های مختلفی تقسیم شوند. اگر نوع متغیر ذخیره شده در محل حافظه که توسط اشاره گر ذخیره می‌شود را در نظر بگیریم، اشاره گرها را می‌توان به انواع زیر طبقه‌بندی کرد:

اشاره گر عدد صحیح (Integer Pointer)

همان‌طور که از نامش پیداست، اشاره گرهایی هستند که به مقادیر صحیح اشاره دارند. نحوه‌ی تعریف آنها بدین شکل است:

int *my_ptr_variable;
end:code

یک اشاره گر می‌تواند به هر نوع داده‌ی اولیه اشاره کند؛ همچنین می‌تواند به انواع داده‌های مشتق شده مانند آرایهآموزش آرایه در ساختمان داده به زبان ساده و از 0 تا 100آموزش آرایه در ساختمان داده به زبان ساده و از 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++ ضروری است؟

بله، اگر این مبحث را به خوبی یاد بگیرید، می‌توانید از ویژگی‌های این زبان‌ها بهره ببرید. اشاره گرها مبحث اصلی و مهمی در این زبان‌ها هستند.

یکی از مزیت های اشاره گرها پیاده سازی انواع ساختمان داده هاست، یعنی چه؟

شما به راحتی می‌توانید انواع ساختمان داده‌های متعارف مثل گراف، درخت‌ها، لیست پیوندی و… را با استفاده از همین مفاهیم پیاده‌سازی کنید.

امتیازدهی5 1 1 1 1 1 1 1 1 1 15.00 امتیاز (2 رای)
اشتراک
بارگذاری نظرات
تلگرام اینستاگرام