مورد اول رو بذارید با یک مثال توضیح بدم. فرض کنید یک تابع دارید که قراره حافظه تخصیصدادهشده به اشارهگر int شما رو آزاد (free) کنه و مقدارش رو برابر با NULL قرار بده. این تابع به چنین شکلی نوشته میشه:
void free_and_null(int **ptr) {
free(*ptr);
*ptr = NULL;
}
مثال:
int *p = (int *)malloc(5 * sizeof(int));
free_and_null(&p);
در حالت کلی وقتی میخوایم داخل یک تابع، یک پوینتر رو به یک آدرس دیگه اشاره بدیم از این روش استفاده میکنیم. کلا مقدار هر چیزی رو بخوایم داخل یه تابع تغییر بدیم از آدرسش (پوینتر) استفاده میکنیم. وقتی مقدار یه int رو بخوایم داخل یک تابع تغییر بدیم از آدرس اون int (پوینتر به اون int) استفاده میکنیم. به طور مشابه وقتی مقدار یک پوینتر رو بخوایم داخل یک تابع تغییر بدیم از آدرس اون پوینتر (پوینتری به اون پوینتر) استفاده میکنیم. به همین سادگی.
مورد ۲:
در C یک رشته (string) مجموعهای ار کارکترهاست که به یک 0 ختم میشه. بعنوان مثال دو تا آرایه زیر دقیقا مقدار و ساختارشون یکیه:
char s1[] = { 'H', 'e', 'l', 'l', 'o', 0 };
char s2[] = "Hello";
printf("s1 = %s, s2 = %s\n", s1, s2);
s1 و s2 هر دو آرایهاند و مقدارشون رو میشه تغییر داد. مثال:
s1[0] = 'G';
s2[0] = 'M';
printf("s1 = %s, s2 = %s\n", s1, s2);
دو اشارهگر زیر رو در نظر بگیرید:
char *p1 = s1;
const char *p2 = s1;
p1 و p2 هر دو اشارهگرهایی به s1 هستند اما فرق شون اینه که p2 نمیتونه مقدار s1 رو تغییر بده. کد زیر کاملا درست عمل میکنه:
p1[0] = 'P';
اما این کد موقع کامپایل ارور میده چرا که اشارهگر p2 نوعش const تعریف شده و اجازه تغییر مقداری که بهش اشاره داره رو نداره:
p2[0] = 'Q';
حالا این دو مورد رو در نظر بگیرید:
char * const p3 = s1;
const char * const p4 = s1;
p3 و p4 مثل حالت قبل هر دو اشارهگرهایی به s1 هستند. دقیقا مثال حالت قبل p3 میتونه محتوای s1 رو تغییر بده اما p4 نمیتونه. حالا تفاوتی که این دو مورد با حالت قبل دارند اینه که این اشارهگر ها نمیتونن به متغیر دیگهای اشاره داشته باشن.
در کد زیر ما میایم میگیم p1 و p2 از این به بعد به یک متغیر جدید اشاره داشته باشن و خب این کار انجام میشه:
p1 = s2;
p2 = s2;
اما کد زیر compile error میده چرا که اشارهگرهای p3 و p4 از نوع ثابتن و اجازه ندارن به متغیر دیگهای اشاره داشته باشن:
p3 = s2;
p4 = s2;
جمعبندی:
- p1 اشارهگریه که هم میتونه به متغیر دیگهای اشاره داشته باشه هم مقدار متغیری که بهش اشاره داره رو تغییر بده
- p2 حق تغییر مقداری که بهش اشاره داره رو نداره اما میتونه به یک متغیر دیگه اشاره کنه
- p3 میتونه مقدار متغیری که بهش اشاره داره رو تغییر بده اما نمیتونه به متغیر دیگری اشاره کنه
- p4 نه میتونه مقداری که بهش اشاره داره رو تغییر بده و نه به متغیر دیگهای اشاره کنه
این موارد رو اگه خوب درک کردین در رابطه با string constant ها و این که چرا رشتهها در C به چنین شکلی نوشته میشن مطالعه کنید:
const char *str = "Hello";
پیشنهاد میکنم کتاب K&R رو هم بخونید.