PDA

View Full Version : اشاره گر به اشاره گر



C3phalex1n_0x
چهارشنبه 01 مرداد 1393, 00:42 صبح
سلام، امروز تو مبحث کار با اشاره گر ها، با یک مبحث چدید با نام Double Pointer رو به رو شدم که نتوستم خیلی دقیق مزئیت استفاده از آن را درک کنم.
یک کد از این مبحث در زیر قرار می دهم، اگر کسی می تونه اون رو تشریح کنه. مرسی

#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
char *titles[] = { "A Tale of Two Cities",
"Wuthering Heights", "Don Quixote",
"Odyssey", "Moby-Dick", "Hamlet",
"Gulliver's Travels" };
char **bestBooks[3];
char **englishBooks[4];

bestBooks[0] = &titles[0];
bestBooks[1] = &titles[3];
bestBooks[2] = &titles[5];
englishBooks[0] = &titles[0];
englishBooks[1] = &titles[1];
englishBooks[2] = &titles[5];
englishBooks[3] = &titles[6];
printf("%s\n", *englishBooks[1]); // Wuthering Heights

}

sa1378
چهارشنبه 01 مرداد 1393, 10:26 صبح
منم تازه واردم ولی احتمالا این ها کار آرایه های دو بعدی رو میکنن
علاوه بر اون میشه از خواص اشاره گر ها هم براشون استفاده کرد

محمد فدوی
چهارشنبه 01 مرداد 1393, 10:30 صبح
اشاره گر به اشاره گر اساسا چیز خاصی نیست. مشکلتم دقیقا نمیدونم کجاست! ولی ببین رشته توی C بصورت آرایه ای از کاراکترها ذخیره میشه و برای ساختن یه رشته دو راه داریم:

char str[] = "Im a String";
char str[] = {'I', 'm', ' ', 'a', ' ', 'S', 't', 'r', 'i', 'n', 'g', '\0'};

(کاراکتر '0\' به اسم کاراکتر صفر شناخته میشه و پایان رشته رو تعیین میکنه. توی حالت اول خود به خود اضافه میشه)
در ضمن میدونیم که‌ آرایه توی C یعنی همون اشاره گر! (یعنی str در هر دو حالت یه اشاره گر هستش به اولین خونه ی خودش)
حالا اگه بخوایم آرایه ای از رشته هارو توی C نگه داریم چکار میکنیم؟ ساده ست! آرایه ای از آرایه ها (یا اشاره گری به اشاره گر) میسازیم...

تو کدی هم که شما گذاشتی english‌Books و bestBooks سه بعدی (اشاره گر به "اشاره گر به اشاره گر"!) تعریف شده که کاملا بی دلیله! میتونست دو بعدی تعریف بشه:

char *bestBooks[3];
char *englishBooks[4];

bestBooks[0] = titles[0];
bestBooks[1] = titles[3];
bestBooks[2] = titles[5];
englishBooks[0] = titles[0];
englishBooks[1] = titles[1];
englishBooks[2] = titles[5];
englishBooks[3] = titles[6];
printf("%s\n", englishBooks[1]); // Wuthering Heights



اگه سوالی بود بپرس دوستان یا من راهنماییت میکنیم.

eshpilen
چهارشنبه 01 مرداد 1393, 10:41 صبح
خیلی وقته سی کار نکردم، ولی تاجاییکه یادم میاد اینطوریه:
رشته در سی آرایه ای از کاراکترهاست. متغییری که به رشته اشاره میکنه هم درواقع اشاره گری به کاراکتر است. یعنی اشاره گری که آدرس خانهء اول/کاراکتر اول اون آرایهء کاراکترها رو در خودش داره.
اینجا یک آرایه از رشته ها تعریف کرده (titles). بنابراین درواقع آرایه ای از اشاره گرهایی به کاراکتر تعریف کرده. بخاطر همین نوعش char *‎ است (یعنی اشاره گر به کاراکتر).
خب بعد اومده آرایه ای بنام bestBooks تعریف کرده با نوع char **‎. یعنی گفته هر عضو این آرایه، اشاره گری به اشاره گری به کاراکتر است.
یعنی توی هر عنصر این آرایه یک آدرس حافظه است، که اون آدرس حافظه محتواش دوباره یک آدرس حافظهء دیگری است که به یک خانهء حافظه که محتوی یک کاراکتر است اشاره میکنه.
خب بعدش هم که معلومه. وقتی بگی titles[0]‎، داری مستقیما اون آدرس حافظهء دوم رو که به کاراکتر اشاره میکنه دریافت میکنی، درحالیکه شما میخوای آدرس خود اون عنصر آرایه رو که توش آدرس خانهء حافظهء نهایی (که توش آدرس یک خانهء حافظه محتوی یک کاراکتر قرار داره) قرار داره رو بگیری، چون نوع آرایهء bestBooks رو char **‎ تعریف کردی و نه char *‎. بنابراین شما میای و با عملگر &، آدرس خود اون عنصر آرایهء رو میگیری و مثلا توی bestBooks[0]‎ میریزی.
یه دستوری مثل ‎*englishBooks[1]‎ هم اینطوری کار میکنه:
اول englishBooks[1]‎ اجرا میشه که محتوی عنصر دوم از آرایهء englishBooks رو برمیگردونه. خب محتوی عنصر دوم از آرایهء englishBooks چیه؟ آدرس یک خانهء دیگر حافظه که محتوی اون خانهء حافظه، اشاره گری به کاراکتر مورد نظر است (که تابع printf انتظار اون اشاره گر به کاراکتر رو داره). بنابراین، شما میای و با عملگر * در مرحلهء بعد، خود متغییر دوم (و نه آدرسش رو)، یعنی اشاره گری به کاراکتر رو بدست میاری و پاس میدی به تابع printf.

eshpilen
چهارشنبه 01 مرداد 1393, 10:44 صبح
تو کدی هم که شما گذاشتی english‌Books و bestBooks سه بعدی (اشاره گر به "اشاره گر به اشاره گر"!) تعریف شده که کاملا بی دلیله! میتونست دو بعدی تعریف بشه:
[CPP]
char *bestBooks[3];
char *englishBooks[4];
...





بله خب اون کد واسه تمرین و آموزش اشاره گر به اشاره گره. چون اشاره گر به اشاره گر هم خیلی جاها کاربرد داره. ولی در این مورد خاص اگر بعنوان کد یک برنامهء واقعی درنظر بگیریم نیازی بهش نیست و صرفا لقمه رو دور سر چرخوندنه.