اشاره گرهاو آرایه های پویا

oranoos_mta

New Member
سلام
اول از همه اینکه از سالک جان کمال تشکر را دارم
دومم اینکه یه پیشنهاد برای سالک جان
اگه میشه راجع به برنامه هایی که مینویسید کم توضیح میدید اگه میشه بیشتر توضیح بدین ممنون میشم
ودر آخر ازتون میخوام که درباره اشاره گرها و ارایه های پویا بیشتر توضیح بدین
مرسی
 

saalek110

Well-Known Member
با سلام.
من همیشه عادت دارم که زیاد توضیح بدهم. ولی چون برنامه های شما پیشرفته بود فرض کردم که کاملا به کدها مسلط هستید. آرایه پویا هم در برنامه اعضای میانه شما بود و راستش من از کد شما یاد گرفتم. لینک
ولی خواهشا دوستان اگر میشه برای ما آرایه پویا و طرز ایجادش را کمی شرح بدهند.

راجع به اشاره گر به این آدرس مراجعه کنید. مقداری را هم نقل می کنم:

اشاره گر ها :

یکی از مفاهیم پایه در ++C اشاره گرها هستند.

در واقع یک اشاره گر همونطور که از اسمش پیداست به یه داده اشاره میکنه !

به این برنامه توجه کنید :

کد:
#include<iostream.h>
#include<conio.h>
int main()
{
 clrscr();
 int x=10;
 int *pointer;
 pointer=&x;
 cout<<"x = "<<x<<endl;
 cout<<"*pointer = "<<*pointer<<endl;
 cout<<"&x = "<<&x<<endl;
 cout<<"pointer = "<<pointer<<endl;
 getch();
 return 0;
}

این هم خروجی برنامه :

pointer2.JPG


شکل زیر مفهوم پوینتر (اشاره گر) را خیلی واضح نشون میده :

pointer.JPG


هر متغیری چه اشاره گر و چه متغیر عادی فضایی در حافظه داره.

محتوای آن سلول حافظه در اشاره گر ها،آدرس یک سلول دیگه از حافظه است.

همونطور که در مثال بالا محتوای pointer برابر ff12 هست که این عدد،آدرس خانه x است !

علامت * محتوای آدرسی را که در اشاره گر هست را برمی گردونه .

مثلآ pointer * محتوای آدرس ff12 یعنی x را برمیگرداند.

اشاره گر به اشاره گر:

کد:
#include <conio.h>		
#include <iostream.h>				
				
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
 int number=3;
[size=4] int [color=red]*[/color]pointer1;[/size]
 pointer1=&number;
 
[size=4] int [color=red]**[/color]pointer2;[/size]
 pointer2=&pointer1;
 
 cout<<"number = "<<number<<"    &number="<<&number<<endl;
 cout<<"pointer1 =            "<<pointer1<<endl;
 cout<<endl<<endl;
 cout<<"&pointer1=            "<<&pointer1<<endl;
 cout<<"pointer2 =            "<<pointer2<<endl;
 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'q') goto menu;
}



174a1.gif


174a2.gif

.

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

و &d که علامت and قبل d باید باشه یعنی آدرس متغیر d . ربطی به اشاره گر هم دارد و هم ندارد. ولی می توانیم ازش استفاده کنیم. مثلا در اارسال به تابع. در مقدار دهی به یک اشاره گر هم از این علامت and استفاده میشه.
براي اينكه قضيه كمي باز بشه ، من برنامه زير را نوشتم.
به نتيجه اجرا نگاه كنيد. Two يك اشاره گر است. وقتي مي خواهيم آنرا چاپ كنيم ، يك آدرس چاپ ميشه.
ولي one را وقتي مي خواهيم چاپ كنيم يك عدد چاپ ميشه. پس اشاره گر نيست.

نكته مهم : به آدرس num و one نگاه كنيد. يكي هستند . هر دو fff2 هستند.
يعني چه؟
آيا دو متغيري هستند كه در يك خانه زندگي مي كنند؟ يا اصلا يكي هستند؟
پاسخ هر چه باشد ، مفهوم يك چيز است ، از ديد Ram هر دو يك سهميه مشترك در حافظه دارند. و two درست دو خانه آن طرف تر اطراق كرده. يعني به فاصله يك int .

کد:
#include <conio.h>		
#include <iostream.h>				
				
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
[color=blue] [size=4]int num=3;
 int &one=num;
 int *two; two=&num;[/size][/color]

cout<<"num= "<<num<<"          &num="<<&num<<endl;
cout<<"one="<<one<<"           &one="<<&one<<endl;
cout<<"two="<<two<<"  &two="<<&two<<endl;
 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'q') goto menu;
}



168.gif

.

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

اما راجع به آرایه پویا و کلا کلمه پویا زیاد مطمئن نیستم ولی چند جمله می نویسم اگر اشتباه گفتم دوستان اصلاح کنند.
آرایه ای که شما در برنامه خود ساختید تعداد خانه اش حین اجرا تعیین میشود ولی آرایه های ساده و غیر پویا وابسته به کد شما است که برنامه نویس نوشته نه اینکه کاربر برنامه شما بتواند خلق یا اندزه آن را کنترل کند. پس کلمه پویا یا کلمه حین اجرا مناسب است. و راه ایجاد آن در سی و سی پلاس فرق دارد فکر کنم که در سی پلاس از کلمات new و delete استفاده می شود . با یکی خلق و با دیگری نابود می شود. و فکر کنم محل نگهداری عناصر پویا با ایستا هم فرق دارد. مثلا متغیر گلوبال محلش در حافظه جایی است و متغیرهای محلی در جایی. که محلی ها در استک(پشته) هستند . ولی محل حافظه پویا فکر کنم در حافظه هیپ باشد.(مطمئن نیستم) . ولی شما به عنوان یک برنامه نویسی که دو نوع آرایه پویا و غیرپویا نیاز دارید در مرحله اول نیاز نیست بدانید محل هر یک کجاست. مگر اینکه بخواهید حجم های زیادی را رزرو کنید و .....
آرایه ساده را هم که ساختنش را بلد هستید . به دو الگوی ساخت آرایه ساده و پویا نگاه کنید و با هم سینتکس را مقایسه کنید. نمی دانم توضیحات کم بود یا زیاد ولی هر موردی بود بگویید تا بیشتر بحث کنیم. دوستان هم هستند کمک می کنند.
 
آخرین ویرایش:

arash_j13

Member
ارایه اصولا یه تعداد خونه ی پشت سر هم توی حافظه هست و از اونجایی که حافظه اصلی برنامه استک هست و سیستم عامل باید همون اول این حافظه رو برای برنامه رزور کنه باید مقدار مشخص و محدود باشه که در نتیجه مجبور می شیم که اندازه آرایه رو مشخص و محدود در نظر بگیریم ولی بیشتر اوقات مقدار فضایی که ما برای آرایه نیاز داریم بسته به شرایط فرق می کنه اینجاست که زبان ها مختلف روش ها مختلفی رو در پیش می گیرن البته درست تر اینکه بگم سینتکس ها مختلف چون در اصل همه اونها یه کار رو انجا می دن اونها این حافظه رو از استک رزور نمی کنن و رزورش رو تا موقع نیاز به تاخیر می ندازن برای همین زحمت رزور حافظه به گردن برنامه نویس انداخته می شه حالا هر زبان یه روشی داره برای این کار تو سی و سی++ به دلیل اینکه ارایه ها یه اشاره گر ثابت هستن برای اینکار از اشاره گر ها استفاده می شه ما کل فضایی که لازم داریم رو حساب می کنیم و به سیستم می گیم که برامون این تکه از حافظه رو رزور کنه چون این تیکه کنار هم رزور می شه می شه مثل یه ارایه باهاش برخورد کرد و یه اشاره رو به اولش ست می کنیم و می تونیم به تمامش دسترسی داشته باشیم
البته یه راه ساده هم هست که می شه این دردسر ها پویا و غیر پویا بودن رو برداشت کتابخانه بسیار قدرتمند سی ++ یه کلاس بسیار کامل به نام vector داره که یه کانتینر هست و یه بردار رو کپسوله کرده خیلی راحت بی درد سر می تونید از این کانتینر استفاده کنید بدون اینکه نگران مسائل حافظه باشید این بردار خودش اندازه اش رو هر موقع لازم باشه بزرگ می کنه و خیلی کار شما رو ساده می کنید استراتروپ تو کتاب The C++ Programing Language توی همون فصل اول توصیه کرده حتی به جای ارایه ساده هم از این کلاس استفاده کنید تا درگیر جزئیات مدیریت حافظه نشید
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا