int **ptr
که به دابل پوینتر هم معروفه ولی ما اشاره گر به اشاره گر اشاره گر هم داریم ( میگید نه؟؟! ):const char *ptr_name
cahr *const ptr_name
const char * const var_name
البته مثل همیشه جستجو کردم ( تو یوتیوب ویدیو های خیلی خوبی بود ولی بازم نفهیمدم:( )خیلی خوشم اومد از تابع اشاره گرکل قدرت توابع string.h از همینه.
fun(&ch);
char *fun( const char *ptr)
یا، (کسی از زیری استفاده نمیکنه.)const char * ptr
void free_and_null(int **ptr) {
free(*ptr);
*ptr = NULL;
}
int *p = (int *)malloc(5 * sizeof(int));
free_and_null(&p);
char s1[] = { 'H', 'e', 'l', 'l', 'o', 0 };
char s2[] = "Hello";
printf("s1 = %s, s2 = %s\n", s1, s2);
s1[0] = 'G';
s2[0] = 'M';
printf("s1 = %s, s2 = %s\n", s1, s2);
char *p1 = s1;
const char *p2 = s1;
p1[0] = 'P';
p2[0] = 'Q';
char * const p3 = s1;
const char * const p4 = s1;
p1 = s2;
p2 = s2;
p3 = s2;
p4 = s2;
const char *str = "Hello";
int number
int* ptr_number
int ** d_ ptr_number
number = 10
ptr_number = &number
d_ptr_number = &ptr_number
در خط پنجم ما اشاره گر نوع اول رو (نوع ساده) برابر با آدرس number قرار دادیم ( تا اینجاش که خیلی راحته) و به محتویات اون دسترسی داریم.some_func(&variable)
int (*pointer_func) (const char*, const char*) = strcmp
ولی آیا این هم درسته؟؟ int (**d_pointer) (const char& , const char& ) = strcmp
strcmp یک از توابع string.h که دو رشته رو مقایسه میکنه( همین داستان اشاره گر از نوع ثابت رو از اینجا فهمیدم و کنجکاو شدم ) دابل پوینتر اشاره گری که به حافظه یک اشاره گر؛ که داره آدرس حافظه و محتویات یک متغیر دسترسی داره.به همین سادگیه. اشارهگر به یک متغیر، یعنی آدرس اون متغیر در حافظه. حالا میخواد متغیر نوعش int باشه double باشه خودش یک پوینتر باشه یا پوینتری به یک پوینتر باشه یا هر چی.
فکر نمیکنم اینقدر ساده باشه
در خط آخر ما یک دابل پوینتر داریم که که به اشاره گر نوع اولمون اشاره میکنه؛ که هم به آدرس اون دسترسی داره هم به محتویاتش درست؟؟
خب یعنی ما اگر مقدار دابل پوینتر رو عوض کنیم هم مقدار number عوض میشه هم مقدار اشاره گر نوع اول؟؟/:
چرا مستقیم خود اشاره گر رو به عنوان آرگومان پاش نمیدیم؟؟مطلبی که دیشب (https://forum.ubuntu-ir.org/index.php?topic=157725.msg1245172#msg1245172) ارسال کردم پاسخ این دو تا پرسش رو داشت.
پیشنهاد میکنم در خصوص Higher-order function مطالعه بکنید.تا حالا اسمش رو هم نشنیدم منظورتون توابع vardiac نیست ( اگر درست گفته باشم)؟ الان میرم سرچه میکنم.
int (**d_ptr) (arg1, arg2) = some_func
و سوالی که پیش میاد اینه که آیا در پرانتز دوم میتونیم یک اشاره گر داشته باشیم؟ مثلا:(*arg1, arg2*)
یه چیزی شبیه به این؛یا باید آدرس حافظه اون رو قرار بدیم؟؟ :(arg1&, &arg2)
رفتم مطالعه کردم.ولی من نمیخوام چیزی رو به عنواه تابع برگردونم فقط منظورم اینه که مثلا یک دابل پوینتر به یک تابع داشته باشیمپوینتر به تابع هم در همین دسته قرار میگیره.
منظورم اینه که مثلا یک دابل پوینتر به یک تابع داشته باشیمجدای از این که چنین کاری امکانپذیر نیست، دقیقا قصد انجام چه کاری رو دارید و دنبال چه کاربردی هستید که باید آدرس آدرس تابع رو داشته باشید!!؟ کاربرد اشارهگر به تابع (function pointer) برای وقتیه که تابع callback داریم:
https://www.tutorialspoint.com/callback-function-in-c
اول مفاهیم پایه رو خوب یاد بگیرید بعد سراغ موارد پیچیدهتری مثل پوینتر به فانکشن و این موارد برید. این که دنبال بدست آوردن آدرس آدرس یک تابع بودید (یک کار غیرممکن و نادرست) معنیش اینه که هنوز با این مفاهیم به خوبی آشنایی ندارید.جفتش رو داردم!!
برای یادگیری زبان C کتاب K&R و برای یادگیری عمیق سوکتنویسی کتاب Hands-On Network Programming with C رو پیشنهاد میکنم
k&r منسوخ شده و زیاد کاربردی نیستفکر نمیکنید هنوز زوده در مورد کاربردی بودن یا منسوخ بودن یک کتاب نظر بدید؟ :)
من ۲۴ ساعته در سایت ها و فروم های مختلف برنامه نویسی میگردم یا حتی یوتیوب. که اکثرشون ۲ چیز رو گفتن:k&r منسوخ شده و زیاد کاربردی نیستفکر نمیکنید هنوز زوده در مورد کاربردی بودن یا منسوخ بودن یک کتاب نظر بدید؟ :)
من ۲۴ ساعته در سایت ها و فروم های مختلف برنامه نویسی میگردم یا حتی یوتیوب.پیشنهاد میکنم این زمان رو بذارید و شروع به خوندن یک کتاب، هر کتابی، در مورد سی بکنید. در حال حاضر به نظر میاد در مفاهیم پایهای زبان سی مشکل دارید و به نظر نمیاد که حتا یک کتاب رو به صورت کامل خونده باشید.
متاسفانه نمیتونم حرف شما رو انکار کنم :) و قبول هم دارم اما وسواس خیلی زیادی رو کتاب دارم با اون مشخصاتی که گفتم.من ۲۴ ساعته در سایت ها و فروم های مختلف برنامه نویسی میگردم یا حتی یوتیوب.پیشنهاد میکنم این زمان رو بذارید و شروع به خوندن یک کتاب، هر کتابی، در مورد سی بکنید. در حال حاضر به نظر میاد در مفاهیم پایهای زبان سی مشکل دارید و به نظر نمیاد که حتا یک کتاب رو به صورت کامل خونده باشید.
پیشنهاد من:مرجع؟ میتونم از هر قسمتی که دوست داشتم شروع بکنم به خوندن؟؟
https://www.gnu.org/software/c-intro-and-ref/manual
int A= 150, *Pa;
Pa = &A;
double D, *Pd;
char ch, *Pc,
Pd = (int)Pa;
چرا باید حتما اینطوری مشخص بکنیم؟؟:Pd = (int*)Pa
طرف صحبتم با اون ستاره ای که تویه پرانتزه! چرا باید اصلا جلوی نوع داده باشه؟؟ چرا نباید پشت نوع داده باشه؟ چرا اصلا باید ستاره وجود داشته باشه!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 *]
int a;
int *p;
خیر، اون ستاره که یه موجودیت مستقل نیست. تمام اون چیزی که داخل پرانتز نوشته شده، نوع (type) متغیره. در مثال زیر نوع متغیر a میشه int نوع متغیر p هم میشه int * (اینت پوینتر).بله متوجه شدم :) خیلی ممنون کم کم دارم یه چیزایی یاد میگیرم و میفهمم ممنونم.کد: [انتخاب]int a;
int *p;
مثال:ممنون از توضیحات گویاتون در مورد اشارهگرها در زبان سی.کد: [انتخاب]int *p = (int *)malloc(5 * sizeof(int));
free_and_null(&p);