PDA

View Full Version : آموزش: لیست پیوندی



C3phalex1n_0x
دوشنبه 24 شهریور 1393, 14:04 عصر
سلام به همه دوستان عزیز گرامی و اساتید صاحب قلم در وب سایت برنامه نویس. اورگ

پیرو قرآن کریم، کلام پروردگار دانا : ذکات علم نشر آن است و همچنین مطابق با حرف امام یازدهم ما شیعیان، امام حسن عسگری (ع) : بهترین کار در دنیا دانش اندوزی و نشر آن به برادران است.

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

مباحثی که در این مقاله مورد بررسی قرار خواهد گرفت:



اشاره گرها چی هستند و چرا از آن ها در برخی موقعیت ها استفاده می شود؟
اشاره گر ها در C و سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎ به چه شکل هستند؟!
ساختارها (Structure) موجود در زبان برنامه نویسی C چه هستند؟!
کلاس ها (Classes) در زبان برنامه نویسی سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎ چه هستند؟!
فرق بین کلاس ها و ساختارها در چیست؟
لیست پیوندی چیست و فرق آن با آرایه ها در چه می باشد؟
نحوه ذخیره سازی عناصر لیست پیوندی و آرایه ها در حافظه به چه شکل است؟
چرا باید از لیست پیوندی استفاده کنیم؟!
کاربرد لیست پیوندی در عمل چیست؟!
الگوریتم چیست و الگوریتم پیاده سازی لیست پیوندی به چه شکل است؟
پیاده سازی لیست پیوندی با ساختار ها به صورت غیر پویا
پیاده سازی لیست پیوندی با ساختار ها به صورت پویا
پیاده سازی تابع افزودن عنصر به لیست پیوندی
پیاده سازی تابع حذف عنصر از لیست پیوندی
پیاده سازی تابع نمایش عناصر موجود در لیست پیوندی
پیاده سازی لیست پیوندی با کلاس ها در زبان برنامه نویسی سی پلاس پلاس
خلاصه مقاله
منابع استفاده شده در نگاشت مقاله


http://upcity.ir/images2/68807010627099788353.jpg

اگر واقعا می خواهید یک برنامه نویس C حرفه ای شوید، نیاز دارید بدانید که C چگونه حافظه را کنترل می کند. زبان برنامه نویسی C بر سر اینکه برنامه شما چگونه از حافظه استفاده کند، کنترل بسیار زیادی به شما ارائه می دهد. در این قسمت شما خواهید فهمید که هنگامی که یک متغیر را تعریف می کنید در حافظه چه اتفاقی می افتد و در حالت کلی با نحوه کنترل حافظه آشنا خواهید شد. شایان ذکر است، به منظور اینکه اشاره گر ها را به درستی یاد بگیرید، باید با نحوه مدیریت اشیاء و داده ها در حافظه آشنایی دقیق و کاملی داشته باشید که در قسمت اول این مقاله به این موضوع خواهیم پرداخت.

اشاره گر ها در C

اشاره گرها یکی از اساسی ترین مفاهیم موجود در زبان برنامه نویسی C هستند که داشتن فهم دقیقی از آنها برای تمامی برنامه نویسان به این زبان الزامی است. اما خب، واقعا اشاره گر ها چه هستند؟! در جواب این سوال به سادگی می توان گفت، یک اشاره گر در واقع یک متغیر است که می تواند آدرس دیگر متغییر ها را در خودش نگه دارد. اشاره گر ها در C به دلایل مختلفی استفاده می شوند که برخی از آنها را در این مقاله با هم بررسی خواهیم کرد.


http://upcity.ir/images2/31824595417338855386.jpg
دلیل اول : در برخی شرایط هنگام برنامه نویسی، نیاز دارید کپی از داده ها موجود در برنامه را به یک تابع از برنامه عبور دهید. این عمل باعث اتلاف حافظه و پایین آمدن راندمان کار برنامه می شود. با این حال، به منظور رفع کردن این مشکل، شما می توانید به سادگی آدرس آن داده های را با استفاده از اشاره گر ها به تابع خود عبور دهید و از اتلاف حافظه و پایین آمدن سرعت کار برنامه جلوگیری کنید.


http://upcity.ir/images2/96748519627214928423.png


دلیل دوم : گاهی اوقات شما نیاز دارید دو تابع به صورت همزمان بر روی قسمتی از داده های برنامه شما کار کنند، در این موقعیت می توانید از اشاره گر ها و آدرس آن قطعه داده استفاده کنید.


http://upcity.ir/images2/61767029443816734656.png

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

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

ورود به درون حافظه

همانطور که قبلا اشاره کردم، به منظور اینکه بتوانید اشاره گر ها را به صورت دقیق متوجه شوید، شما نیاز خواهید داشت به درون حافظه کامپیوتر وارد شوید و آن را با دقت مورد بررسی قرار بدهید.

شایان ذکر است، هرگاه که شما یک متغیر تعریف می کنید، کامپیوتر برای آن در قسمتی از حافظه یک فضا ایجاد می کند. به عنوان مثال، اگر شما یک متغیر درون یک تابع مانند main() تعریف کنید، کامپیوتر آن را در یک قسمت از حافظه به نام پشته (Stack) ذخیره می سازد و اما اگر متغیر را در خارج از توابع تعریف کنید، آن متغیر درون قسمت عمومی (Globals) و همچنین اگر متغیری را به شکل ثابت تعریف کنید آن در قسمت ثابت (Constant) حافظه ذخیره خواهد شد. در تصویر زیر، به صورت بصری این موضوع نمایش داده شده است.


http://upcity.ir/images2/32409924367201993851.png


این نکته را هم به خاطر بسپارید، عملا کامپیوتر با حروف کار نمی کند. اساس کار کامپیوتر با اعداد و آدرس ها است (البته حروف هم معادل عددی دارند :ی ). مثلا هنگامی که شما یک متغیر با نام x در برنامه خود تعریف می کنید (کد نمایش داده شده در تصویر بالا را در نظر بگیرید)، کامپیوتر برای آن در آدرس 4.100.000 حافظه می گیرد، در نتیجه هر بار که به آن رجوع شود، در واقع به آدرس آن متغیر رجوع می شود و هنگامی که مقداری در آن متغییر ذخیره می گردد، در واقع مقداری در آدرس 4100000 ذخیره می شود.

به عبارت کلی تر، نام یک متغیر در واقع نامی هست که شما به یک قسمت از حافظه اختصاص می دهید تا به آن ساده تر دسترسی بگیرید. با این حال، اگر در موقعیتی نیاز داشتید که آدرس یک متغیر را درون حافظه بدست آورید، می توانید از عملوند & استفاده کنید. این عملوند باعث می شود آدرس یک قطعه داده یا در مفهوم شی گرایی (Object Oriented) آدرس یک شی (Object) بازگشت داده شود.


http://upcity.ir/images2/16287734334430871155.png


همانطور که در قطعه کد بالا مشاهده می کنید، ما توانستیم با استفاده از عملوند & و با استفاده از تابع printf آدرس متغیر در حافظه را به سادگی به دست آوریم.

نکته : خیلی مواقع مشاهده می کنم دانشجوهای گرامی با درک واژه شی (Object) کمی مشکل دارند و اساتید در دانشگاه با مثال زدن های بصری مانند آجر و دیوار و ماشین سعی در انتقال مفهوم شی موجود در علوم کامپیوتر را دارند که به نظر بنده بی سواد اشتباه است. طبق تعریف شی در ویکیپدیا و کورس Introduction to Programing دانشگاه کارنگی ملون (اسم استادش رو یادم رفته) شی در واقع چیزی در حافظه است که شامل داده (Data) و یک شناسه (Identifier) می شود که می توانند مجموعه ای از عملیات ها را انجام بدهند (البته به شکل خیلی خلاصه گفتم، شما هم بهتر است همین دید را فعلا نسبت به شی داشته باشید).


http://upcity.ir/images2/79231341616290823173.png
این آموزش ادامه خواهد داشت.

C3phalex1n_0x
دوشنبه 24 شهریور 1393, 16:26 عصر
در این قسمت با هم دیگر سعی می کنیم کمی با اشاره گر ها آشنا شویم.

عملگرهای اشاره گر در سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎ :

عملگر & : این عملگر دارای یک عملوند است و آدرس عملوند خود که نام یک متغیر است را مشخص می نماید.
عملگر * : این عملگر هم دارای یک عملوند است و محتویات (مقادیر) جایی که عملوندش (نام اشاره گر) به آنجا اشاره می کند را مشخص می کند .

int *pointer, x, y; // define three variables whit int type
x = 9; // equal x to 9
pointer = &x; // pointer contains Address of x

y = *pointer // y equal the contains of content address of pointer

در کد سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎ بالا سه متغیر از نوع int تعریف شده اند که یکی از آنها از نوع اشاره گر است. همانطور که مشاهده می کنید، در خط دوم مقدار 9 در متغیر x قرار می گیرد و سپس آدرس متغیر x در متغیر اشاره گر pointer قرار می گیرد، یعنی متغیر اشاره گر pointer به جایی از حافظه اشاره می کند که متغیری بنام x و از نوع int که مقداری برابر 9 به آن تخصصیص داده شده است در آنجا قرار دارد. در آخرین خط محتویات جایی که آدرس آن در اشاره گر pointer ذخیره شده است، یعنی مقدار 9 در متغیر y قرار می گیرد.


http://upcity.ir/images2/93707681035915797500.gif
#include <iostream.h>
#include <conio.h>

void main()
{
int firstValue, secondValue;
int *myPointer;


myponter = &firstValue;
*myponter = 10; // firstValue = *myponter = 10
myponter = &secondValue;
*myponter = 20; // secondValue = *myponter = 20
cout << "The firstValue is " << firstValue;
cout << "\nThe secondValue is " << secondValue;

getch();

}

در خطوط 6 و 7 برنامه سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎ بالا سه متغیر از نوع int مشاهده می کنید که یکی از آنها از نوع اشاره گر است. دستور خط 9 آدرس متغیر firstValue را در اشاره گر قرار می دهد. در خط بعد محتویات جایی که اشاره گر به آنجا اشاره می کند برابر با مقدار 10 تنظیم می شود. چون جایی که متغیر myPointer به آنجا اشاره می کند آدرس متغیر firstvalue است، پس مقدار 10 در آنجا و در واقع در متغیر firstValue و به همین ترتیب در متغیر secondValue ریخته خواهد شد.


اشاره گر ها به عنوان آرگومان های توابع :


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


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


int increase(int x, int count = 1) // count variable has a default value: 1
{
x += count; // The copy of x will be changed, not the orginal x sent from caller
return x;
}
int main(int argc, char* argv[])
{
int i = 10;
int j = increase(i, 5); // The first parameter is a variable and the second is a constant
cout << "i = " << i << "n"; // i = 10
cout << "j = " << j << "n"; // j = 15

j = increase(10, 5); // Both parameters are constant!
cout << "j = " << j << "n"; // j = 15
return 0;


ارسال پارامتر به صورت ارجاع، این حالت دو تفاوت عمده با روش ارسال با مقدار دارد: اول این که خود متغیر اصلی به تابع ارسال شده و هر گونه تغییری که تابع روی متغیر بدهد، روی متغیر اصلی اعمال خواهد شد. دوم اینکه به همین دلیل، نمی توان عدد ثابت را به عنوان پارامتر ارسال کرد! چون در این صورت متغیری وجود نخواهد داشت که تابع با آن کار کند. نکته دیگر این که این متغیرها نمی توانند مقدار پیش فرض داشته باشند. برای معرفی یک پارامتر به صورت ارجاع از علامت & استفاده می کنیم. در مثال زیر، تنها تابع increase تغییر کرده است دقت کنید که در اینجا متغیر i پس از فراخوانی تابع تغییر خواهد کرد، ضمنا خط ماقبل آخر خطایی ایجاد می کند، چرا؟

int increase(int &x, int count = 1) // The first parameter is declared by reference, but the second is declared by value
{
x += count;
return x;
}

int main(int argc, char* argv[])
{
int i = 10;
int j = increase(i, 5);
cout << "i = " << i << "n"; // i = 15
cout << "j = " << j << "n"; // j = 15

j = increase(10, 5); //WRONG, since the first parameter can not be constant

return 0;
}



برای درک تفاوت میان روش ارسال پارامتر ها با استفاده از مقادیر یا ارجاع (آدرس) مثالی دیگری را بررسی خواهیم نمود :

#include <iostream.h>#include <conio.h>


void pass(int, int *);


void main()
{
int x = 1, y=1;
pass(x, &y);
cout << "x=" << x << "\n";
cout << "y=" << y << "\n";
getch();
}
void pass(int a, int *b)
{
cout << "x=" << ++a << "\n";
cout << "y=" << ++*b << "\n";

}

با اجرای کد سی پلاس پلاس بالا، کامپایلر در سطر 6 ابتدا وارد تابع main خواهد شد. دو متغیر از نوع int با نامهای x,y تعریف شده که هر کدام دارای مقدار برابر یک هستند. در سطر 8 کامپایلر با فراخوانی تابع pass به سطر 14 می رود. در این تابع دو پارامتر که یکی int و دیگری اشاره گر است را می بیند. ما با اینکار مقدار x را با ارسال پارامتر بروش مقدار و y را با استفاده از ارسال پارامتر بروش ارجاع انجام داده ایم، یعنی مقدار x را و آدرس y را به تابع می فرستیم. در سطر 16 ابتدا یک واحد به x اضافه شده وسپس چاپ می شود که مقدار 2 را خواهیم داشت .در سطر 17 ابتدا یک واحد به مقدار جایی که آدرس آن محل به عنوان پارامتر (اشاره گر) به تابع ارسال شده اضافه خواهد شد و بعد 2 چاپ خواهد شد.

با پایان بلوک تابع pass کامپایلر باز به تابع main بازگشته و ادامه دستورات را از سطر 10 از سر می گیرد .در سطر 10 چون x با مقدار به تابع ارسال شده بود پس مقدار آن در ابن تابع همان 1 است پس اینبار 1 چاپ خواهد شد. اما در سطر 11 چون با آدرس متغیر y کار کردیم پس مقدار کنونی در این تابع هم دستخوش تغییرات در تابع pass خواهد بود و عدد 2 برای آخرین دستور چاپ می شود و برنامه پایان میابد .امیدوارم که توانسته باشم مفهوم ارسال با مقدار و ارجاع یا آدرس را رسانده باشم. اما اگر متوجه نشدید اصلا نگران نباشید و با کمی تمرین براحتی مطلب را درک خواهید نمود.

C3phalex1n_0x
سه شنبه 25 شهریور 1393, 19:32 عصر
تنظیم بادبان های کشتی با استفاده از اشاره گرها

تصور کنید شما در حال نوشتن یک بازی هستید که بازی کننده های باید کشتی را در آن راهبری کنند.


http://upcity.ir/images2/40779053456177229289.png

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



http://upcity.ir/images2/87861395528607057609.png


با این حال فکر می کنید، هر کدام از این توابع باید با اشاره گرها چه کاری انجام بدهند؟! بگذارید کد نویسی را بدون اینکه اشاره گرها را در نظر بگیریم شروع کنیم. در این قسمت از کدنویسی متغیر ها را به صورت مستقیم استفاده خواهیم کرد. بزرگترین قسمت این برنامه راهبری کشتی از اطراف مثلث برمودا است، بنابراین اجازه بدهید بررسی کنیم کد یک تابع برای راهبری کشتی به چه چیزی نیاز دارد.

تنظیم کردن کشتی برای رفتن به جنوب شرقی

در این بازی موقعیت بازی کننده با استفاده از آرگومان های latitudes و longitudes دنبال می شود. پارامتر یا آرگومان latitude موقعیت کشتی از شمال تا جنوب و longitudes موقعیت کشتی از شرق تا غرب را مشخص می کند.


http://upcity.ir/images2/49033731356217927535.png

اگر یک بازیکن بخواهد به سمت جنوب شرقی حرکت کند این بدین معناست که مقدار پارامتر latitude آن باید کم شود و مقدار پارامتر longitude آن باید زیاد شود. بنابراین شما می توانید یک تابع با نام go_south_east() بنویسید که این دو پارامتر را بگیرد و تغییرات را بر روی آنها اعمال کند.



http://upcity.ir/images2/46835641110536860191.png

برنامه یک کشتی را در موقعیت [32,-64] را شروع به راهبری می کند. بنابراین پس از عبور مقادیر پارامتر ها به تابع go_south_east باید آنها به مقادیر [31,-63] به روز رسانی شوند. حداقل اگر کد درست کار کند باید این اتفاق بیفتد.

سوال : با این حال، به کد با دقت نگاه کنید، آیا فکر می کنید این کد واقعا کار می کند؟ اگر نه، دلیل کار نکردن آن چیست؟


http://upcity.ir/images2/17031235481687700363.png




همانطور که مشاهده می کنید کد به درستی کار نمی کند، با اینکه به درستی کامپایل می شود اما خطای منطقی دارد و نتیجه آن چیزی نیست که ما انتظار داریم. همانطور که در خروجی مشاهده می کنید، بعد از اینکه برنامه اجرا می شود مقادیر longitude و latitude تغییر نمی کند. حال به منظور اینکه بتوانیم این مشکل را حل کنیم چه باید کنیم؟ البته قابل ذکر است، دلیل اینکه این تکه کد به درستی کار نکرد، به خاطر نحوه مدیریت اشیاء و داده ها در حافظه توسط C است که در این قسمت با جزئیات آن را بررسی نخواهیم کرد. ولی همینقدر بدانید که هر تابع که فراخوانی می شود در حافظه پشته، برای خود فضا می گیرد و داده های خودش را در آن تعریف می کند و پس از اینکه کارش به اتمام می رسد، فضایی که در پشته گرفته است را آزاد می کند. به همین دلیل هنگامی که تابع فراخوانی می شود، مقادیر متغیر های درون آن تغییر نمی کند. با این حال، با ویرایش کد برنامه به شکل زیر و با استفاده از اشاره گر ها به عنوان پارامتر های توابع می توانید این مشکل در برنامه را حال کنید.


http://upcity.ir/images2/02203932731578726472.jpg


بعد از اینکه کد را کامپایل و اجرا کنید، مشاهده خواهید کرد که کد به درستی عملیات خودش را انجام می دهد.


http://upcity.ir/images2/88411083356123812512.jpg

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

این آموزش ادامه خواهد داشت.

C3phalex1n_0x
سه شنبه 25 شهریور 1393, 22:20 عصر
پیامبر خدا صلى‏ الله ‏علیه و ‏آله و سلّم می فرماید:

(العِلمُ خَزائنُ ومَفاتِیحُهُ السُّؤالُ ، فَاسألُوا رَحِمَکُمُ اللّه‏ُ فإنّهُ یُؤجَرُ أربَعةٌ : السائلُ ، والمُتَکلِّمُ ، والمُستَمِعُ ، والُمحِبُّ لَهُم)

دانش گنجینه‏ هایى اسـت و کـلـیدهاى آن پرسش است؛ پس خدایتان رحمت کند، بپرسید که با این کار چهار نفر اجر مى‏ یابند : پرسشگر ، پاسخگو ، شنونده و دوستدار آنان .



خب برای اینکه مبحث اشاره گر ها را به اتمام برسانیم، در این قسمت با هم دیگر به فرق موجود بین اشاره گر ها در C و ارجاعات یا Reference ها در سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎ خواهیم پراخت و با ذکر یک مثال آن ها را نشان خواهیم داد.

اشاره گر ها در C و سی پلاس پلاس‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎ به چه شکل هستند؟!

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

اشاره گر ها در C

#include <stdio.h>
int main(){
int x = 20;
int *ptrA = &x;


*ptrA = 21;
printf("The value of the x variable updated from the pointer : %d", x);
return 0;
}
همانطور که در کد بالا مشاهده می کنید، در زبان C از عملوند های & و * به صورت مرتب برای کار با اشاره گر ها استفاده می شود که کمی قالب دستوری آن پیچیده است. مثلا از عملوند & برای بازیابی آدرس یک متغیر و از عملوند * برای تعریف یک اشاره گر و دسترسی پیدا کردن به محتوایی که اشاره گر به آن اشاره می کند، استفاده می شود.

در مثال بالا مشاهده می کنید که ابتدا ما یک متغیر با نام X از نوع Int تعریف کردیم که دارای مقدار 20 است. در گام بعد آدرس آن را در یک اشاره گر ذخیره کردیم و در پایان از طریق اشاره گر مقدار متغیر X را افزایش دادیم. این فرم استفاده از اشاره گر ها در زبان C است. اما در سی پلاس پلاس با معرفی ارجاعات یا متغیرهای مرجع این موضوع کمی ساده تر شده است که در ادامه آنها را بررسی خواهیم کرد.

ارجاعات در سی پلاس پلاس

#include <iostream>
using namespace std;


int main(){
int x = 20;
int &ptrA = x;


ptrA = 21;
cout << "The value of the x variable updated from the pointer : " << x << endl;
return 0;

}همانطور که در بالا مشاهده می کنید، دستورالعمل های استفاده شده در کد سی پلاس پلاس خیلی ساده تر شده اند. در کد بالا ما به سادگی یک متغیر از نوع مرجع تعریف کردیم که در این متغیر فقط آدرس دیگر اشیاء ذخیره می شود. در این کد ما ابتدا یک متغیر از نوع int تعریف کرده و سپس به آن مقدار 20 را تخصصیص داده ایم. سپس یک متغیر از نوع مرجع با استفاده از عملوند & تعریف کردیم و آدرس متغیر عمومی را در آن ذخیره ساختیم و در نهایت با استفاده از متغیر مرجع محتوای خانه ای که به آن اشاره می کند را به روز رسانی کردیم و در خروجی محتوای جدید متغییر x را چاپ کردیم.

امیدوارم این قسمت هم به درد شما بخورد. این آموزش ادامه دارد.

C3phalex1n_0x
چهارشنبه 26 شهریور 1393, 02:01 صبح
http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/mysql-capi-tutorial-fig10.png

ساختارها (Structure) موجود در زبان برنامه نویسی C چه هستند؟!

همانطور که می دانید ما در زبان برنامه نویسی C یک نوع داده به نام ساختار یا ساختمان (Structure) داریم که می توانیم از آن برای گروه بندی مجموعه ای از عناصر داده ای مختلف استفاده کنیم. این نوع داده در زبان برنامه نویسی C با کلیدواژه struct تعریف می شود.

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

به عنوان مثال، اگر در برنامه ای اطلاعات کارمندی ذخيره می شود، نگهداری داده های مجزا مانند نام، فامیل، حقوق و غیره در متغیرهای جداگانه و تشخيص اينکه داده ها متعلق به اطلاعات کارمند است آسان نيست.

ساختار یا ساختمان (structure) راه ساده ای برای گروه بندی چند متغیر مرتبط بهم تحت یک نام مشترک است. نوع متغيرهای درون ساختارها برخلاف آرايه می تواند متفاوت از يکديگر و از هر نوع داده استاندارد، آرايه، اشاره گر يا حتی ساختمار باشد.

هر متغير درون ساختار يک جزء از ساختار ناميده می شود. تعریف کلی ساختار به صورت زیر است:

struct structurename{
vartype varname;
vartype varname;

} variable ;

کلمه کليدی struct شروع تعريف ساختمان یا ساختار است. بدنبال آن اسم نوع ساختار می آيد که مانند اسامی متغیرها هر اسم مجازی می تواند باشد. اجزای ساختار درون آکولاد قرار می گيرند.

مثال : تعريف نوع ساختار کارمند به نام employee با اجزای lastname، firstname و salary در زیر آمده است.

struct employee {
char lastname[30];
char firstname[30];
float salary;

};

وقتی ساختار را تعریف می کنید می توانید متغیری از نوع آن را اعلان کنید تا مانند متغیرهای دیگر فضائی از حافظه برای آن کنار گذاشته شود. فضای مورد نیاز بستگی به اندازه ساختار دارد. اندازه ساختار با جمع کلیه نوع های داده اجزای آن محاسبه می شود.

دو راه برای تعريف متغير ساختمان یا ساختار وجود دارد: بلافاصله بعد از تعريف ساختمان يا در محل ديگری از برنامه تعریف شوند.

مثال : اعلان متغير ساختار MyEmployee از نوع employee بلافاصله بعد از تعريف ساختمان.
struct employee {
char lastname[30];
char firstname[30];
float salary;

}MyEmployee;

مثال : اعلان متغير ساختار SecondEmployee از نوع ساختمان موجود employee.

struct employee SecondEmployee;