1 / 66

برنامه سازی پیشرفته

برنامه سازی پیشرفته. فصل هشتم – اشاره گرها (pointers) : اشاره گر: متغیری است که آدرس متغیر دیگری را در خود نگه می دارد. اشاره گر، به آدرس متغیر دیگر اشاره می کند. مقدار اشاره گر ، آدرس یک خانه از حافظه است. اشاره گر، یک روش غیرمستقیم دسترسی به داده ها است.

sibyl
Download Presentation

برنامه سازی پیشرفته

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. برنامه سازی پیشرفته فصل هشتم – اشاره گرها (pointers): اشاره گر: متغیری است که آدرس متغیر دیگری را در خود نگه می دارد. اشاره گر، به آدرس متغیر دیگر اشاره می کند. مقدار اشاره گر ، آدرس یک خانه از حافظه است. اشاره گر، یک روش غیرمستقیم دسترسی به داده ها است. نکته : در اکثرزبانهای قدیمی برنامه نویسی مفهومی مانند اشاره گر وجود ندارد ولی ویژگی بارز زبانC استفاده متعدد از اشاره گرها و انجام عملیات محاسباتی روی آنها است .

  2. برنامه سازی پیشرفته • موارد کاربرد اشاره گرها : 1 ) انتقال آدرس متغیرها به تابع فرعی 2) برگرداندن چندین مقدار از تابع فرعی 3) دستیابی به عناصرآرایه ها 4) تشکیل ساختارهای پیچیده تر مثل فهرستهای پیوندی ، درختها و نمودارها 5) عمل تخصیص حافظه بصورت پویا

  3. برنامه سازی پیشرفته • دوعملگر یا اپراتوری که دراشاره گرها استفاده می شوند عبارتند از ‘*’ و ’&’ . عملگر ’ &’ عملگری یکانی است که آدرس عملوند خود را مشخص می کند . عملگر ‘ * ’ عملگری یکانی است که محتویات آدرس حافظه را مشخص می کند .

  4. برنامه سازی پیشرفته • نحوه معرفی اشاره گرها: برای استفاده از اشاره گر باید اول آنرا تعریف کرد. شکل کلی تعریف اشاره گرها بصورت زیر است : data-type * ptvar ; data-typeنوع متغیری است که آدرس آن در متغیر اشاره گر ptvarقرار می گیرد. ptvarنام متغیرموردنظراست . ’*’ نیز نماد اپراتور اشاره گر است .

  5. برنامه سازی پیشرفته • انواع متغیرهای اشاره گر : 1) اشاره گر به متغیر عددی 2) اشاره گر به متغیر کاراکتری 3) اشاره گر به آرایه ها 4) اشاره گر به توابع 5) اشاره گر به ساختارها 6) اشاره گر به اشاره گر

  6. برنامه سازی پیشرفته • در حالت کلی هر نوع داده ذخیره شده در حافظه ، یک یا چند بایت متوالی از خانه های حافظه را اشغال می کند. • درصورتی می توان به داده دسترسی داشت که آدرس اولین خانه یا اولین بایت آن را در حافظه بدانیم . • آدرس متغیرaدر حافظه با &a تعیین میشود که & اپراتور یکانی آدرس نام دارد و آدرس عملوند خود را به دست می دهد.

  7. برنامه سازی پیشرفته • اگر متغیر aاز نوعintومتغیر pa نیز متغیر اشاره گر بوده و بصورت زیر توصیف شده باشد: int *pa ; در اینصورت با دستور جایگذاری pa=&a آدرس متغیر aبه اشاره گر pa نسبت داده میشود . Pa را اشاره گر aمی نامند ، زیرا به محلی از حافظه اشاره می کند که مقدار متغیر aدر آن ذخیره شده است . نکته : paآدرس متغیر aرا معرفی می کند نه مقدار آن را به همین دلیل آن را متغیر اشاره گر نامند .

  8. برنامه سازی پیشرفته • رابطه بین paو aدر شکل زیر نشان داده شده است : pa آدرسa مقدارa

  9. برنامه سازی پیشرفته • داده ای که با a معرفی می شود با عبارت *pa در دسترس قرار می گیرد که در آن * اپراتور یکانی است که فقط روی متغیرهایی از نوع اشاره گر عمل می کند . • aو*pa هردو محتوای خانه های یکسان از حافظه را معرفی می کنند . • با اجرای دو دستور pa=&a ; k=*pa ; k وaهردو یک مقدار را معرفی خواهند کرد . یعنی مقدار aبه طور غیرمستقیم به kنسبت داده خواهد شد. • نتیجه هر دو دستور فوق مشابه نتیجه دستور انتسابk=a است.

  10. برنامه سازی پیشرفته • عملگر* در مورد *pa محتوای محلی را برمی گرداند که آدرس آن در paقرار دارد ، به همین دلیل آن را ”عملگر غیرمستقیم“ هم می نامند . • *pa در سمت چپ دستور انتساب نیز می تواند ظاهر شود . مثلا اگر داشته باشیم : pch=&ch ; *pch=‘ b ‘ ; با اجرای دستور دوم کاراکترb به متغیر ch نسبت داده می شود .

  11. برنامه سازی پیشرفته آدرس داده ها: • هر متغیر دارای یک آدرس منحصر به فرد است که محل آن را در حافظه مشخص می کند و گاه بهتر است برای دست یابی به متغیر در عوض نام متغیر ، از آدرس آن استفاده شود . • برای بدست آوردن آدرس متغیر ، از اپراتور&یا ( ampersand) استفاده می شود. • مثلا اگر متغیر kاز نوع long int معرفی و آدرس آن 1004باشد، با اجرای دستور ptr=&A ; مقدار 1004 (آدرس متغیر A) در متغیر ptrذخیره می شود که البته متغیر ptr باید از نوع اشاره گر توصیف شده باشد که به متغیری از نوع longint اشاره می کند .

  12. مثال 8-1 صفحه 162برنامه زیر مقدار و آدرس متغیر A را چاپ می کند. #include<stdio.h> main ( ) { int A=5 ; printf(“ The value of A is : %d\n”,A) ; printf(“ The address of A is :%p\n” , &A); } توضیح : در تابع printf از کدفرمت %p استفاده شده خروجی برنامه بصورت زیر است The vaue of A is : 5 The address of A is : 1004

  13. قطعه برنامه فوق را بصورت زیر هم می توان نوشت: #include<stdio.h> main ( ) { int A=5 ; int *pA ; pA =&A ; printf(“ The address of A is : %p\n” , pA); }

  14. برنامه سازی پیشرفته • موارد استفاده ازعملگرستاره ‘ * ’ 1) برای معرفی متغیرهای عملگر ( در سمت چپ متغیر ) مانند: int *p1 , *p2 , *p3; float *p4 , *p5 ; 2) جهت دست یابی به مقدار متغیری که آدرس آن در متغیر اشاره گر قرار دارد ، مانند : p1=&a ; *p1=a ;

  15. مثال 8-2 صفحه 163 به برنامه زیر توجه کنید #include<stdio.h> main( ) { char *pch ; char ch1=‘Z’ , ch2 ; printf(“the address of pchis%p”,&pch); pch=&ch1 ; printf(“the value stored at pch is %p\n”,pch) ; printf(“the value stored at the address pointed by pch is %c\n” , *pch) ;

  16. ch2=*pch ; printf(“the value stored at ch2 is%c\n” ,ch2) ; } توضیح : دراین برنامه متغیرpchاشاره گری به متغیرهایی از نوع کاراکتر توصیف شده متغیرهای ch1وch2نیز از نوع کاراکتر اعلان شده اند که به متغیرch1مقدار اولیه کاراکتر ‘a’را نسبت می دهد. در دستور printfاول آدرس متغیر pchچاپ می گردد که به فرض 1004 است. سپس آدرس متغیرch1به pchنسبت داده میشود. در دستور printfدوم مقدارpch(آدرس متغیرch1)که به فرض2001 است چاپ میشود. در دستور printfسوم محتوای خانه ای از حافظه که آدرس آن در متغیر pchقراردارد (یعنی مقدار متغیرch1) و کاراکتر ‘a’است چاپ میشود در خط بعد همین مقدار (یعنی حرف ‘a’) به متغیر ch2نسبت داده میشود. با دستور printf آخری مقدار متغیر ch2 (که همان حرف ‘a’است ) چاپ میشود

  17. خروجی این برنامه بصورت زیر است : the address of pch is 1004 the value stored at pch is 2001 the value stored at the address pointed by pch is Z the value stored at ch2 is Z

  18. برنامه سازی پیشرفته مقدار دهی اولیه به اشاره گر : • به هر متغیر از نوع اشاره گرنیز می توان هنگام اعلان آنها ، مقدار اولیه نسبت داد . در این صورت مقدار اولیه مورد نظر باید یک آدرس باشد. • اشاره گر NULLیا یک آدرس را به عنوان مقدار اولیه می پذیرد. مثلا : int x ; int *px=&x ;

  19. برنامه سازی پیشرفته • نمی توان متغیری را قبل از این که توصیف یا اعلان گردد در دستوری به کاربرد . پس دستورات زیر قابل قبول نیست : int *px=&x ; int x ; • برای بعضی مواردویژه می توان اشاره گررا به صورت زیر هم مقداردهی اولیه کرد : int *ptr=0 ;

  20. برنامه سازی پیشرفته • درحالت کلی نسبت دادن مقدار صحیح به متغیر اشاره گر مفهوم ندارد .در چنین مواردی توصیه می شود که ثابت سمبولیکی مانند NULLرا که معرف صفر باشد تعریف و آن را به اشاره گر اختصاص داد . • این روش تاکید می کند که اختصاص دادن صفر، معرف شرایط خاصی است . • در اغلب کامپایلرهای Cثابت سمبولیک NULLدر چندین header fileوبویژه در <stdio.h>تعریف شده است . • اختصاص دادن مقدار اولیه صفر یا NULL به یک اشاره گر، هم ارز هستند ولی NULLترجیح داده می شود.

  21. برنامه سازی پیشرفته اشاره گرتهی (NULL) : اشاره تهی ، اشاره گری است که به هیچ چیز قابل قبول یا معتبری اشاره نمی کند یا مقدار صحیح صفر به آن نسبت داده شده باشد. • اشاره گر تهی بویژه دردستورهای مربوط به کنترل جریان مفید است ، چون اشاره گرهایی با مقدارصفر false درنظرگرفته می شوند ، درحالی که متغیرهای اشاره گر با سایر مقادیر true منظور می گردند .

  22. مثال 8-5 صفحه 166در برنامه زیر حلقه whileتا موقعی که اشاره گر NULL نباشد ، عمل تکرار ادامه می دهد. char *p ; …….; …….; while(p) { …….; ……; } توضیح : این گونه کاربرد اشاره گرها بویژه در کاربردهایی آشکار می گردد که آرایه هایی از اشاره گرها را به کار می برد.

  23. برنامه سازی پیشرفته • انواع عملیاتی که روی اشاره گرها انجام پذیر است : الف) انتساب یا جایگذاری ب) اعمالمحاسباتی شامل جمع و تفریق و ++ و- - ج) مقایسه اشاره گرها

  24. برنامه سازی پیشرفته الف ) انتساب : • درمورد اشاره گرها هم مانند سایر متغیرها می توان مقداری را به متغیر نسبت داد ولی این عمل مانند سایر متغیرها گسترده نیست . • به متغیر اشاره گر می توان آدرس متغیر یا مقدار صفر نسبت داد.

  25. برنامه سازی پیشرفته ب) محاسبه : • عملیات مخاسباتی روی اشاره گرها ، شامل چهار عمل + ، - ، ++ و - - می باشد. • اگر دو متغیر اشاره گر از یک نوع باشند ، یعنی اشیایی که اشاره گرهای فوق به آن اشاره می کنند یکسان باشد، می توان مقادیر آن دو اشاره گر را از هم تفریق کرد. • مثلا مقدار &a[0]&a[3] –برابر 3 خواهد بود. • درواقع تفاضل فوق تعداد اشیاء بین این دو اشاره گر را معرفی می کند .

  26. برنامه سازی پیشرفته • می توان مقدار صحیحی را به اشاره گرها اضافه یا از آن کسر کرد ولی باید به مفهوم آن توجه نمود. • مثلا p+5به پنج شی بعد از شیی که p به آن اشاره می کند اشاره خواهد کرد. • اگر pمتغیری از نوع short intبوده باشد که دوبایت از حافظه را اشغال می کند ، عبارتp+5 به 10 بایت بعد از آدرسی که pمعرف آن است (10=2×5) اشاره خواهد کرد. • اگر p آدرسمتغیری از نوع floatبوده باشد p+5 به 20 بایت بعد (20=4×5) اشاره خواهد کرد .

  27. برنامه سازی پیشرفته • P+5 همیشه به مفهوم ” اندازه 5 شئ بعد از شیئی که pاشاره می کند ” خواهد بود . • کامپایلر 5 را در بزرگی یا طول شئ مورد نظر ضرب می کند و آن را به محتوای p اضافه می کند تا آدرس جدید بدست آید .

  28. مثال 8-6 صفحه 167 به برنامه زیر توجه کنید #include<stdio.h> main( ) { int *px , *py ; static int A[6]={1,2,3,4,5,6} ; px=&A[0] ; py=&A[5] ; printf(“px=%x py=%x” ,px ,py) ; printf(“\n py-px=%x” ,py-px) ; } توضیح : با توجه به کاراکتر فرمت در دستور printfکه از نوع %x تعریف شده است ، خروجی دستور printfاول آدرس دو متغیر pxوpyبرحسب هگزا دسیمال خواهد بود . خروجی دستور printfدوم اختلاف pxوpy برحسب هگزا دسیمال(5)را چاپ خواهد کرد . (5)16=(5)10

  29. برنامه سازی پیشرفته ج) مقایسه : • متغیرهای اشاره گر را که هردو از یک نوع مشابه باشند می توان با هم مقایسه کرد . • یعنی دواشاره گر را می توان در یک عبارت رابطه ای با یکدیگر مقایسه کرد .

  30. مثال 8-7 صفحه 168 اگر pxوpyاشاره گرهایی باشند که به عناصری از یک آرایه اشاره می کنند چند عبارت منطقی حاصل از آنها به این شکل خواهد بود : px<py px>=py px==py px !=py px==null همچنین دستورات زیر درست است : if(px<py) printf(“px points to lower memory than py”); else printf(“px points to upper memory than py”);

  31. ویژگی های اشاره گرها : الف) عمل تخصیص حافظه بصورت پویا را ممکن می کنند ب ) کار با آرایه ها و رشته ها را آسان می کنند ج ) موجب بهبود کارایی بسیاری از توابع میشوند د ) فراخوانی با آدرس را در مورد توابع ممکن می کنند و در نتیجه برگردان بیش از یک مقدار از یک تابع میسر می شود . نکته 1 – کلمه کلیدی far برای تعریف اشاره گرهایی که به ذخیره بیش از دو بایت نیاز دارند به کار می رود و قبل از نام متغیر اشاره گر و بعد از تعیین نوع اصلی ذکر می شود مانند char far *ptr ; نکته 2 – کلمه کلیدی huge برای تعریف اشاره گرهایی که آدرس هایی بیش از 16 بیت را در خود ذخیره می کنند به کار می رود .

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

  33. مثال صفحه 168 برنامه زیر دو مقدار صحیح 4 و 7 را به تابعی به نام gets2می فرستد main( ) { int x=4 , y=7 ; gets2(x,y) ; } Void gets2(xx , yy) /*printout values of two arguments */ Int xx , yy ; { printf(“first is %d , secind is %d” , xx,yy ) ; }

  34. main() { int x=4 ; int y=7 ; gets2(x,y) ; ….…………. } ساز وکار انتقال مقادیر به تابع gets2(xx,yy) int xx , yy ; { printf(“first is%d , second is%d”,xx ,yy) }

  35. مثال 8-10 صفحه 171تفاوت بین آرگومانهای معمولی و اشاره گر #include<stdio.h> main( ) { int u=1 ; int v=3 ; void func1(int u , int v) ; void func2(int *pu , int *pv) ; printf(“Before calling func1: u=%d ,v=%d” ,u,v); func1(u,v) ; printf(“After calling func1:u=%d,v=%d”,u,v); printf(“Before calling func2:u=%d,v=%d”,u,v); func2(u,v) ; printf(“After calling func2: u=%d,v=%d”,u,v); }

  36. void func1(int u, int v) { u=0 ,v=0 ; printf(“Within func1 : u=%d , v=%d” ,u,v ) ; return ; } void func2( int *pu , int *pv) { *pu=0 , *pv=0 ; printf(“Within func2 :*pu=%d,*pv=%d”,*pu,*pv) ; return ; }

  37. توضیح :خروجی برنامه به این شکل خواهد بود Before calling func1 : u=1 , v=3 Within func1 : u=0 , v=0 After calling func1 : u=1 , v=3 Before calling func2 : u=1 , v=3 Within func2 : *pu=0 , *pv=0 After calling func2 : u=0 , v=0 تابع func1دومتغیر از نوع صحیح را به عنوان آرگومان می پذیرد . تابعfunc2دواشاره گر به متغیرهای صحیح را به عنوان آرگومان می پذیرد .

  38. برنامه سازی پیشرفته انتقال دو طرفه اطلاعات : • وقتی تابعی آدرس متغیری را در برنامه فراخواننده آن بداند ، می تواند : 1) مقادیر آن متغیر را تغییر دهد . 2) از مقدارآن متغیر استفاده کند . • روش فوق محدودیتی را که در برگرداندن نتایج تابع فرعی به کمک نام آن تابع وجود دارد ، ( فقط می توان یک مقدار را با نام تابع برگرداند ) ازبین می برد .

  39. مثال8-11صفحه172دربرنامه زیرضرایب معادله درجه دومی خوانده وسپس بافراخواندن تابع فرعی root ریشه های معادله محاسبه می شود و به تابع اصلی برمی گرداند. اگر ریشه حقیقی نداشته باشد تابع فرعی هردوریشه را صفر برمی گرداند. اگر معادله ریشه داشته باشد ضرایب معادله همراه با ریشه های آن در تابع اصلی چاپ میشود. #include<stdio.h> #include<math.h> main() { float a,b,c,x1,x2 ; scanf(“%f %f %f” , &a , &b, &c) ; root (a,b,c, &x1, &x2) ; if(x1==0 && x2==0) printf(“\n %f %f %f no real solution”,a,b,c); else printf(“\n %f %f %f %f %f ”,a,b,c,x1,x2) ; }

  40. void root (a,b,c,px1,px2) float a,b,c,*px1,*px2 ; { float d, delta ; delta=b*b - 4*a*c ; if (delta<0) { *px1=*px2=0 ; return ; } else { d=sgrt(delta) ; *px1=(-b+d)/(2*a) ; *px2=(-b-d)/(2*a) ; return ; } }

  41. برنامه سازی پیشرفته اشاره گرها و آرایه ها : • نام آرایه در واقع اشاره گری به اولین عنصر آن است . به عبارت دیگر نام آرایه ، آدرس اولین عنصرآن آرایه است . • مثلا اگر داشته باشیم char str[80] , *p ; p= str ; • از آنجا که دو دستور زیر هم ارزند ، لذا در اشاره گر pآدرس آرایه ، یعنی اولین عنصر آرایه قرار داده شده است . p=&str[0] ; p=str ;

  42. برنامه سازی پیشرفته روشهای دست یابی به عناصر یک آرایه nعنصری مثل a[n] : 1) دست یابی از طریق اندیس آرایهa[k] 2) دست یابی از طریق اشاره گر*(p+k) 3) دست یابی از طریق اشاره گر *(a+k) • هرسه دستورفوق هم ارزهستند و محتوای خانه k ام آرایه که (k+1)امین عنصر آرایه است را برمی گردانند ولی دست یابی به عناصر از طریق اشاره گر سریعتر از استفاده از اندیس است .

  43. برنامه سازی پیشرفته • مثلا اگر داشته باشیم int a[15] , *p ; p=&a[0] ; هرسه عبارت a[3] و*(p+3)و*(a+3)هم ارزند و چهارمین عنصر ازپانزده عنصر آرایه aرا برمی گردانند. • چون نام آرایه معرف آدرس آغاز آن است، *(a+k) آدرس k امین خانه یا (k+1)امین عنصر از آرایه مزبور را برمی گرداند.

  44. 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 nums[0] = *(nums+0) nums[1] = *(nums+1) nums[2] = *(nums+2) nums[3] = *(nums+3) nums[4] = *(nums+4) nums nums+1 nums+2 nums+3 nums+4 nums+3 = 1400+3×2=1400+6=1406 جمع اشاره گرها ( آدر سها و مقادیر)

  45. برنامه سازی پیشرفته • منظور از *(nums+k)محتوای kخانه بعداز numsاست که در آن بزرگی هر خانه مساوی بزرگی داده یا شئ موردنظر در آرایه برحسب بایت است . • در عبارت *(nums+k) اپراتورستاره * ’‘به عنوان یک عملگر غیر مستقیم ، محتوای خانه یا آدرس nums+k را در اختیار قرار می دهد . • array[index] با *(array+index)یکسان است . • اگر x[i]در سمت چپ یک دستور جایگذاری باشد ، می توان به جای آن *(x+i)را به کار برد .

  46. برنامه سازی پیشرفته • عباراتی مثل &x[i] ، x ، x+iکه معرف آدرس است نمی توانند در سمت چپ دستور جایگذاری به کار بروند. • آدرس آرایه نمی تواند به طور دلخواه تغییر یابد ، پس عبارتی مثل ++xهممجاز نیست . • تعریف آرایه به روش قراردادی موجب میشود که بلوک ثابت از حافظه در آغاز اجرای برنامه رزرو شود. قبل از پردازش عناصر ارایه به آنها حافظه اختصاص داده می شود. • در تعریف آرایه عددی بصورت اشاره گر نمی توان مقدار اولیه تخصیص داد. بهتر است این آرایه ها بصورت عادی تعریف شوند.

  47. مثال8-12 صفحه 176 برنامه زیر را درنظربگیرید #include<stdio.h> main( ) { static int x[6]={10,11,12,13,14,15} ; inti ; for(i=0 ; i<6 ;++i) printf(“\n i=%d, x[i]=%d, *(x+i)=%d, &x[i]=%x , x+i=%x”, i, x[i] , *(x+i), &x[i], x+i) ; }

  48. خروجی برنامه توضیح : فرض بر این است که آدرس آرایه ، 72 در مبنای 16باشد )

  49. مثال 8-13 صفحه 178 برای تعریف آرایه 10 عنصری aاز مقادیر صحیح می توان به جای int a[10] ; به صورت int *a نوشت ، یعنی a را متغیر اشاره گر تعریف کرد . در روش دوم به aیک بلوک از حافظه اختصاص نمی یابد بلکه بصورت متغیر اشاره گر تعریف شده است . برای اختصاص حافظه مورد نیاز به aجهت معرفی آرایه ای10 عنصری ، می توان از تابع mallocبصورت زیر استفاده کرد a=malloc (10*sizeof(int)) ; این تابع بلوک حافظه ای برای ذخیره کردن 10 مقدار صحیح رزرو می کند. اپراتور sizeofبزرگی نوع داده برحسب intرا برحسب بایت برمی گرداندو این مقدار در 10 (تعداد عناصر آرایه )ضرب میشود تا فضای مورد نیاز برحسب بایت تعیین و رزروشود.

  50. از لحاظ اطمینان کامل می توان از تبدیل نوع castاستفاده کرد و آن را بصورت زیر به کار برد a=(int*)malloc(10*sizeof(int)) ; این گونه اختصاص حافظه به روش اختصاص حافظه پویا موسوم است . • اگر قرار باشد به عناصر آرایه ، مقدار اولیه اختصاص یابد ، بایدa به جای متغیر اشاره گر بصورت آرایه توصیف شود مانند زیر int a[10]={1,2,3,4,5,6,7,8,9,10} ; یا int a[ ]={1,2,3,4,5,6,7,8,9,10}

More Related