انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: اشاره گر ها و انواع آن  (دفعات بازدید: 2082 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19720
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : اشاره گر ها و انواع آن
« پاسخ #15 : 03 فروردین 1403، 05:14 ب‌ظ »
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : اشاره گر ها و انواع آن
« پاسخ #16 : 03 فروردین 1403، 05:39 ب‌ظ »
پیشنهاد من:
https://www.gnu.org/software/c-intro-and-ref/manual
مرجع؟ میتونم از هر قسمتی که دوست داشتم شروع بکنم به خوندن؟؟
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : اشاره گر ها و انواع آن
« پاسخ #17 : 03 فروردین 1403، 10:19 ب‌ظ »
درود

یه سایت خیلی خوب برای درک بهتر اشاره گر ها پیدا کردم :

https://pythontutor.com/c.html#mode=edit


ای کاش یه دیباگر اینطوری داشتم :'( خیلی خوب تصویر سازی میکنه و خودش گویای همه چیزه.
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : اشاره گر ها و انواع آن
« پاسخ #18 : 03 فروردین 1403، 11:02 ب‌ظ »
دوستان یک سوال ذهن من رو داره میخوره.

یک اشاره گر به تنهایی هیج نوعی نداره درست؟؟ و فقط به یک متغیر از یک نوع خاص اشاره میکنه درسته؟
مثلا :

پس چرا این کد خطا میده؟:
int A= 150, *Pa;
Pa = &A;
double D, *Pd;
char ch, *Pc,
Pd = (int)Pa;

چرا باید حتما اینطوری مشخص بکنیم؟؟:
Pd = (int*)Pa
طرف صحبتم با اون ستاره ای که تویه پرانتزه! چرا باید اصلا جلوی نوع داده باشه؟؟ چرا نباید پشت نوع داده باشه؟ چرا اصلا باید ستاره وجود داشته باشه!
میشه یکی بگه تبدیل نوع در اشاره گر ها به چه صورته؟؟ چیز زیادی رو اینترنت نیاورد فقط یه سایت خوب اورد:

https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://ecomputernotes.com/what-is-c/function-a-pointer/type-casting-of-pointers&ved=2ahUKEwjttaTCx4iFAxUE_rsIHRb5C4EQFnoECBMQAQ&usg=AOvVaw2uU99zP48osv9_ax6dct3a
« آخرین ویرایش: 03 فروردین 1403، 11:18 ب‌ظ توسط learner:~$ »
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین sd70

  • Jr. Member
  • *
  • ارسال: 96
  • جنسیت : پسر
پاسخ : اشاره گر ها و انواع آن
« پاسخ #19 : 04 فروردین 1403، 12:41 ق‌ظ »
هنوز مفاهیم پایه‌ای پوینتر رو شما خوب درک نکردین و به نظرم نباید سراغ type casting تو پوینترها برید. دقیقا به همین دلیله که میگید چند تا کتاب رو خوندین اما هنوز مفاهیم پایه C رو درک نکردید چون هیچ کدومش رو نمی‌خونید.

خب بگذریم. خیلی خلاصه بخوام بگم، تو قطعه کد زیر میایم b که یک double هست رو cast میکنیم به یک int و اونو میذاریم داخل a که یه int ـه:
int a;
double b;

b = 40.75;
a = (int)b; // cast [double] to [int]
دقیقا با همین منطق توی کد زیر، q که نوعش double *‎ (اشاره‌گر double) هست رو cast می‌کنیم به یک int *‎ (اشاره‌گر int) و اونو میذاریم داخل p که یک int *‎ ـه: (مثال زیر صرفا جنبه آموزشی داره)
int *p:
double *q;

q = &b;
p = (int *)q; // cast [double *] to [int *]

این مورد ارتباطی به موضوع نداره اما با توجه به لینکی که قرار دادین توصیه می‌کنم افزونه Don't track me Google رو روی مرورگرتون نصب کنید.
« آخرین ویرایش: 04 فروردین 1403، 01:24 ق‌ظ توسط sd70 »

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : اشاره گر ها و انواع آن
« پاسخ #20 : 04 فروردین 1403، 08:15 ق‌ظ »
خب یعنی این ستاره در اون پرانتز فقط یک سینتکس به خصوصه درسته؟
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین sd70

  • Jr. Member
  • *
  • ارسال: 96
  • جنسیت : پسر
پاسخ : اشاره گر ها و انواع آن
« پاسخ #21 : 04 فروردین 1403، 11:29 ق‌ظ »
خیر، اون ستاره که یه موجودیت مستقل نیست. تمام اون چیزی که داخل پرانتز نوشته شده، نوع (type) متغیره. در مثال زیر نوع متغیر a میشه int نوع متغیر p هم میشه int *‎ (اینت پوینتر).
int a;
int *p;
« آخرین ویرایش: 04 فروردین 1403، 11:33 ق‌ظ توسط sd70 »

آفلاین learner:~$

  • Hero Member
  • *
  • ارسال: 816
  • جنسیت : پسر
  • روزی روز گاری در گنو/لینوکس
پاسخ : اشاره گر ها و انواع آن
« پاسخ #22 : 04 فروردین 1403، 11:40 ق‌ظ »
خیر، اون ستاره که یه موجودیت مستقل نیست. تمام اون چیزی که داخل پرانتز نوشته شده، نوع (type) متغیره. در مثال زیر نوع متغیر a میشه int نوع متغیر p هم میشه int *‎ (اینت پوینتر).
int a;
int *p;
بله متوجه شدم  :) خیلی ممنون کم کم دارم یه چیزایی یاد میگیرم و میفهمم ممنونم.
مثل سمی کالونم( ; ).
خواستار پایان.
محکوم به کامپایل.

آفلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1270
  • جنسیت : پسر
پاسخ : اشاره گر ها و انواع آن
« پاسخ #23 : 18 فروردین 1403، 11:59 ب‌ظ »
مثال:
int *p = (int *)malloc(5 * sizeof(int));
free_and_null(&p);
ممنون از توضیحات گویاتون در مورد اشاره‌گرها در زبان سی.
برای تکمیل مطلب لازمه که اضافه کنم

در سی نیازی به تبدیل نوع صریح نوع اشاره گر برای تابع malloc نیست.
تبدیل از *void به عنوان نوع بازگشتی از malloc به نوع متناسب برحسب عبارت سمت چپ به صورت خودکار انجام می‌شود و در سی برخلاف ++C نیازی به تبدیل صریح نداریم.

به علاوه در صورت عدم موفقیت اجرای malloc در اختصاص حافظه تبدیل نوع اشاره‌گر می‌تواند مقدار عددی در متغیر چپ عبارت قرار دهد. ممکن است که چنین کاری به یک حالت و رفتار پیشبینی نشده Undefined Behavior منجر شود.


یک بررسی اجمالی روی کدهای لینوکس نشان می‌دهد تنها در همین چهل و سه مورد روی malloc تبدیل صریح داریم.


https://paste.ubuntu-ir.org/yvxv


« آخرین ویرایش: 19 فروردین 1403، 01:08 ق‌ظ توسط esmaeelE »