پوینترها در زبان برنامه نویسی C

در زبان برنامه نویسی C و در میکروکنترلرهای STM32 ، پوینتر یک متغیر یا ثابت 32 بیتی و بدون علامت است که مقدارش آدرس چیزی در حافظه میباشد. در این مقاله هر چیزی که در مورد پوینتر وجود داره رو آموزش میبینید.

 

فهرست

– تعریف پوینتر در زبان برنامه نویسی C

– دستیابی به آدرس متغیرها در زبان C با reference operator

– دسترسی به محتوای حافظه در زبان C با dereference operator

– دسترسی به محتوای آدرس پونیتر با براکت مربعی در زبان C

– ساخت پوینتر ثابت در زبان C با کست کردن

– نوع پوینتر در زبان برنامه نویسی C

– پوینترهای void در زبان برنامه نویسی C

– تعریف پوینتر با const در زبان برنامه نویسی C

– پوینترهای NULL در زبان C

– پوینترهای آویزان یا dangling pointer در زبان C

– عملیات ریاضی روی پوینترها در زبان C

تعریف متغیر پوینتر در زبان برنامه نویسی C

متغیر پوینتر یک فضای 32 بیتی هست که یک آدرس در اون ذخیره میشه. برای تعریف متغیر پوینتر در زبان سی ابتدا نوع متغیری رو مینوسید که پوینتر قراره آدرس اون متغیر رو در خودش ذخیره کنه. فرض کنید قراره پوینتری بسازیم که آدرس متغیر myvar از نوع int16_t رو در این پوینتر ذخیره کنیم. در تعریف متغیر پوینتر ابتدا مینویسی int16_t ، سپس علامت استریسک ( * ) نوشته میشه ، و سپس نام پوینتر ، در این مثال پوینتری به نام mypointer تعریف شده.

 

تعریف متغیر پوینتر در زبان برنامه نویسی C

 

نکته : در متغیر mypointer فقط میتونیم آدرس متغیرها یا رجیسترهایی از نوع int16_t رو ذخیره کنیم. چون نوعش uint16_t * هست.

دستیابی به آدرس متغیرها در زبان C با reference operator

یک متغیر به نام myvar از نوع int16_t تعریف شده. آدرسش کجاست؟

برای دستیابی به آدرس یک متغیر در زبان C کافیه قبل از اون متغیر عملگر رفرنس ( & ) یا reference operator رو قرار بدهیم. در مثال زیر آدرس متغیر myvar در متغیر پوینتر mypointer ذخیره شده.

 

reference operator و دسترسی به محتوای آدرس در زبان برنامه نویسی C

 

&myvar رو میخونیم ، address of myvar .

دسترسی به محتوای حافظه در زبان C با dereference operator

در زبان برنامه نویسی سی میتونیم مستقیم به حافظه دسترسی داشته باشیم ، امکانی که در پایتون و جاوا وجود ندارد. برای دسترسی به آدرسی در حافظه به پوینتر نیاز داریم. فرض کنید از پوینتری که در مثال قبل تعریف شده قراره استفاده کنیم تا به متغیر myvar دسترسی داشته باشیمT کافیه قبل از پوینتر mypointer علامت استریسک قرار بدیم. نام دیگر علامت استریسک dereference operator هست. 

دسترسی به محتوای حافظه در زبان برنامه نویسی C با dereference operator

*mypointer مشابه myvar از نوع int16_t هست. در حقیقت *mypointer همون myvar هست.

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

 

در مثال اول آرایه ای با 4 عضو از نوع int16_t با نام array تعریف شده. برای دسترسی به اعضای آرایه ، بعد از اسم آرایه براکت مربعی میگذاریم و ایندکس عضور آرایه که میخواهیم بهش دسترسی پیدا کنیم رو مینویسیم. اعضای آرایه در حافظه پشت سر هم چیده شده اند.

 

دسترسی به اعضای آرایه در زبان C با برکت مربعی

 

اسم آرایه پوینتر هست. بعد از هر پوینتری هم میتونیم برکت مربعی بذاریم و به محتوای آدرس دسترسی داشته باشیم. در مثال زیر اگر بعد از پوینتر myptr براکت مربعی بذاریم، با ایندکس 0 میتونیم به محتوای از نوع int16_t که در آدرس myptr ذخیره شده، که متغیر myvar هست، دسترسی پیدا کنیم. دو عبارت *myptr و myptr[0] مشابه هم هستند.

 

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

 

دقت کنید هر ایندکسی داخل براکت مربعی میتونید بنویسید، ولی کار خوبی نیست، چون نباید به جاهایی از حافظه که نمیدونیم اونجا چی ذخیره شده دسترسی پیدا کنیم.

ساخت پوینتر ثابت

برای ساخت پوینتر ثابت باید نوع و مقدارش رو بدونیم. فرض کنید قراره یک پوینتر ثابت بسازیم بجای mypointer که نوع و مقدارش مشابه mypointer هست.

متغیر mypointer از نوع int16_t * هست و مقدارش آدرس متغیر myvar که این رو باید بریم از بخش دیباگ نگاه کنیم آدرسش کجاست ( آدرس متغیرها در RAM اگر کد رو تغییر بدید ممکنه عوض بشه، این یک مثال برای یادگیری شماست و به این مسئله توجه نمیکنیم.)

برای ساخت پوینتر ثابت ابتدا مقدارش رو مینوسیم (که مقدار mypointer و آدرس myvar ) هست. در مرحله ی دوم در یک پرانتز در پشت مقدار، نوع این مقدار که int16_t * هست ( مشابه نوع mypointer ) رو مینویسیم. به مشخص کردن نوع یک مقدار در پرانتز قبل از مقدار در زبان C ، میگن کست کردن ( casting ).

 

ساخت پوینتر ثابت در زبان برنامه نویسی C

 

اگر قبل از پوینتر ثابت علامت استریسک بذاریم میتونیم به محتوای از نوع int16_t که در آدرس 0x2 ذخیره شده دسترسی داشته باشیم.

نوع پوینتر در زبان برنامه نویسی C

نوع هر چیز در تعریف اون قبل از اسمش نوشته شده. تعریف پوینتر هم یک جورایی تعریف دوچیز هست. مثلا در تعریف mypointer، هم خود mypoiner تعریف شده ، هم *mypoiner . نوع mypointer و همچنین نوع mypointer* قبل از اسمشون در تعریفشون نوشته شده.

 

نوع پوینتر در زبان برنامه نویسی C

پوینترهای void در زبان برنامه نویسی C

نوع این پوینترها void * است و فقط میتونن یک آدرس رو در خودشون نگه دارن ولی مشخص نیست آدرس چه چیزی رو ذخیره کردن و آدرس هر نوع متغیر یا تابعی رو میتونید در این نوع پوینترها ذخیره کنید. اگر علامت استریک رو قبل از این پوینتر ها بگذارید ، خطا میگیرید. یعنی با پوینترهای void نمیتوان به حافظه دسترسی داشت.

 

پوینترهای void در زبان برنامه نویسی C

تعریف پوینتر با const در زبان برنامه نویسی C

وقتی کلمه ی کلیدی const رو در ابتدای تعریف متغیر قرار بدهیم. مقدار اون متغیر دیگر نمیتواند تغییر کند و همیشه مقدار اولیه ای خودش رو نگه میداره. در مورد پوینتر هم میتونیم همچین کاری انجام بدیم. پوینتری که مشابه متغیر هست ولی مقدارش تغییر نمیکنه و مقدارس اولیه خودش رو نگه میداره. در مثال زیر پوینتری با مقدار صفر از نوع void * تعریف شده و مقدارش هم قابل تغییر نیست. از این پوینتر میشه برای مقداردهی اولیه سایر پوینترها استفاده کرد.

 

پوینتر با کلمه ی کلیدی const در زبان برنامه نویسی C

پوینتر های NULL در زبان برنامه نویسی C

 

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

پوینترهای آویزان یا dangling pointer در زبان سی

 

پوینترها عادی هستند که مقدارشون دیگه آدرس چیزی نیست، یک زمانی بوده ولی الان نیست. فرض کنید یک متغیر پوینتر global دارید ، یعنی پوینتری که خارج از توابع تعریف شده و در یک تابع آدرس یک متغیر local رو در این پوینتر ذخیره میکنید . بعد از تمام شدن فراخوانی تابع ، متغیر های local عمرشون تموم میشه و از بین میرن و آدرسی ندارند. پس آدرسی که در پوینر ذخیره کردید بی اعتبار شده.

عملیات ریاضی روی پوینترها در زبان C

 

در زبان برنامه نویسی C وقتی یک متغیر پوینتر با عدد یک جمع میشه، آدرسی که در پوینتر ذخیره شده الزاما بعلاوه ی 1 نمیشه. بستگی به نوع متغیری داره که پوینتر آدرسش رو ذخیره میکنه.

 

اعمال ریاضی روی پوینترها در زبان برنامه نویسی C

 

وقتی پوینتر با 1 جمع بشه نتیجه میشه آدرس متغیر فرضی بعدی در حافظه . مثلا اگر پوینتر آدرس متغیرهایی از نوع uint16_t رو ذخیره کنه (که حجمشون دو بایت هست) و مقدارش رو با 1 جمع کنیم، نتیجه میشه آدرس متغیر فرضی بعدی از نوع uint16_t در حافظه یعنی با 2 جمع میشه.

اگر پوینتر آدرس متغیرهایی از نوع uint32_t ( با حجم 4 بایت ) ذخیره کنه وقتی با یک جمع میشه، نتیجه میشه آدرس متغیر فرضی بعدی از نوع uint32_t در حافظه ، پس آدرس با 4 جمع میشه. اگر عدد آدرس رو با 3 جمع کنیم ، آدرس با 3 ضرب در 4 (حجم متغیر uint32_t ) که میشه 12 جمع میشه.

به این مسئله میگن pointer arithmetic یا اعمال ریاضی پوینترها.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا