نشانگرهای C
جدول محتوا
- یک اشاره گر است؟
- آدرس در سی
- متغیرهای اشاره گر
- & و * اپراتور
- مثال: چگونه اشارهگر کار می کند؟
- اشتباهات رایج
اشاره گرها ویژگی های قدرتمند C و (C ++) برنامه نویسی هستند که از دیگر زبان های برنامه نویسی محبوب مانند Java و Python متفاوت است.
اشاره گرها در برنامه C برای دسترسی به حافظه و دستکاری آدرس استفاده می شود.
آدرس در سی
قبل از اینکه به مفهوم اشاره گرها برسید، ابتدا با آدرس در C آشنا شوید.
اگر متغیر var را در برنامه خود داشته باشید، &var
آدرس شما را در حافظه به شما می دهد، که در آن &
عموما اپراتور مرجع نامیده می شود.
شما باید این علامت را در هنگام استفاده از تابع scanf()
کنید. این در عملکرد برای ذخیره مقدار ورودی کاربر در آدرس var استفاده شد .
اسکن ("٪ d"، & var)؛
#include <stdio.h> int main() { int var = 5; printf("Value: %d\n", var); printf("Address: %u", &var); //Notice, the ampersand(&) before var. return 0; }
خروجی
ارزش: 5 آدرس: 2686778
توجه: در هنگام استفاده از این کد ممکن است ارزش آدرس متفاوت را بدست آورید.
در کد منبع بالا، مقدار 5 در مکان حافظه 2686778 ذخیره می شود. var فقط نامی است که به آن مکان داده می شود.
متغیرهای اشاره گر
در C، شما می توانید یک متغیر خاص ایجاد کنید که آدرس را ذخیره می کند (به جای مقدار). این متغیر به نام متغیر اشاره گر یا به سادگی یک اشاره گر است.
چگونه یک متغیر اشاره گر ایجاد کنیم؟
data_type * pointer_variable_name؛ int * p؛
بیانیه فوق، p را به عنوان متغیر اشاره گر نوع int
تعریف می کند.
اپراتور مرجع (&) و اپراتور Dereference (*)
همانطور که گفته شد، &
عملگر مرجع نامیده می شود. این به شما آدرس متغیر می دهد.
به همین ترتیب، اپراتور دیگری وجود دارد که ارزش آن را از آدرس دریافت می کند، آن را اپراتور Dereference نامیده می شود.
در زیر مثال به وضوح استفاده از اشاره گرها، اپراتور مرجع و اپراتور dereference را نشان می دهد.
نکته: علامت *
هنگام اعلام یک اشاره گر اپراتور dereference نیست. این یک نماد مشابه است که نشانگر را ایجاد می کند.
مثال: چگونه نشانگر کار می کند
#include <stdio.h> int main() { int* pc, c; c = 22; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); pc = &c; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); c = 11; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); *pc = 2; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); return 0; }
#include <stdio.h> int main() { int* pc, c; c = 22; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); pc = &c; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); c = 11; printf("Address of pointer pc: %u\n", pc); printf("Content of pointer pc: %d\n\n", *pc); *pc = 2; printf("Address of c: %u\n", &c); printf("Value of c: %d\n\n", c); return 0; }
آدرس c: 2686784 مقدار c: 22 آدرس اشاره گر کامپیوتر: 2686784 محتوای اشاره گر کامپیوتر: 22 آدرس اشاره گر کامپیوتر: 2686784 محتوای اشاره گر کامپیوتر: 11 آدرس c: 2686784 مقدار c: 2
int* pc, c;
در اینجا، یک اشاره گر کامپیوتر و یک متغیر نرمال c
از آنجا که pc و c در ابتدا در ابتدا مقداردهی نمی شوند، اشاره گر pc به هیچ یک از آد هر دو نوعint
ایجاد می شود. رس ها یا یک آدرس تصادفی اشاره نمی کند. و متغیر c دارای یک آدرس است اما حاوی مقدار تصادفی زباله است.c = 22;
این 22 را به متغیر c اختصاص می دهد، یعنی 22 در مکان حافظه متغیر c ذخیره می شود .
توجه داشته باشید که هنگام چاپ&c
(آدرس c)، از%u
به جای%d
استفاده می کنیم، زیرا آدرس معمولا به عنوان یک عدد صحیح بدون علامت (همیشه مثبت) بیان می شود.pc = &c;
این آدرس متغیر c را به اشاره گر کامپیوتر اختصاص می دهد .
شما می بینید که مقدار کامپیوتر همان آدرس c است و محتوای کامپیوتر نیز 22 است.c = 11;
این 11 را به متغیر c اختصاص می دهد.
از آن جایی که اشاره گر کامپیوتر به همان آدرس c اشاره می کند، مقدار اشاره شده توسط اشاره گر کامپیوتر نیز 11 است.*pc = 2;
این مقدار را در محل حافظه اشاره شده توسط اشاره گر کامپیوتر به 2 تغییر دهید.
از آنجا که آدرس اشاره گر کامپیوتر همان آدرس آدرس c است ، مقدار c نیز به 2 تغییر می کند.