ارسال آرایه ها به توابع

    برای ارسال يک آرايه به عنوان آرگومان به يک تابع ، کافيست نام آرايه را بدون علامت براکت ([]) به کار ببريد . به عنوان مثال اگر آرايه ای با نام x به صورت زير تعريف شده باشد :

int x[24];

   برای ارسال آن به تابع modifyArray کافيست تابع را به صورت زير:

modifyArray(x,24);

   فراخوانی کنيد . دستور فوق آرايه و طول آن را به تابع modifyArray  ارسال می کند . معمولاً هنگامی که آرايه ای را به تابعی ارسال می کنند ، طول آرايه را نيز همراه آرايه به عنوان يک آرگومان جداگانه به تابع می فرستند.

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

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

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

void modifyArray (int b[] ,int array size)

   دستور فوق مشخص می کند که تابع modifyArray قادر به دريافت آدرس آرايه ای از اعداد صحيح توسط آرگومان b و تعداد عناصر آرايه توسط آرگومان arraySize می باشد . ضمناً تعداد عناصر آرايه را لازم نيست بين براکت ها ([]) بنويسيد ، اگر اين کار نيز صورت پذيرد ، کامپايلر آن را ناديده می گيرد . توجه داشته باشيد که پيش تعريف تابع فوق را به صورت زير بنويسيد :

void modifyArray (int [] , int);

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

#include <iostream.h>
 
void modifyArray( int [], int );
void modifyElement( int );
 
void main()
{
  const int arraySize = 5; 
  int a[ arraySize ] = { 0, 1, 2, 3, 4 };
 
  cout<<"Effects of passing entire array by reference:"
      <<"\n\nThe values of the original array are:\n";
 
  // output original array
  for ( int i = 0; i < arraySize; i++ )
    cout << "\t"<< a[ i ];
 
  cout << endl;
 
  // pass array a to modifyArray by reference
  modifyArray( a, arraySize ); 
 
  cout << "The values of the modified array are:\n";
 
  // output modified array
  for ( int j = 0; j < arraySize; j++ )
    cout << "\t" << a[ j ];
 
  // output value of a[ 3 ]
  cout<<"\n\n\n"
      <<"Effects of passing array element by value:"
      <<"\n\nThe value of a[3] is " << a[ 3 ] << '\n';
 
  // pass array element a[ 3 ] by value
  modifyElement( a[ 3 ] );
 
  // output value of a[ 3 ]
  cout << "The value of a[3] is " << a[ 3 ] << endl;
 
}
 
// in function modifyArray, "b" points to 
// the original array "a" in memory
void modifyArray( int b[], int sizeOfArray )
{
  // multiply each array element by 2
  for ( int k = 0; k < sizeOfArray; k++ )
  b[ k ] *= 2;
}
 
// in function modifyElement, "e" is a local copy of
// array element a[ 3 ] passed from main
void modifyElement( int e )
{
  // multiply parameter by 2
  cout << "Value in modifyElement is " 
       << ( e *= 2 ) << endl;
}

   خروجی برنامه فوق به صورت زير می باشد :

Effects of passing entire array by reference:
 
The values of the original array are:
        0       1       2       3       4
The values of the modified array are:
        0       2       4       6       8
 
 
Effects of passing array element by value:
 
The value of a[3] is 6
Value in modifyElement is 12
The value of a[3] is 6

   در برنامه فوق ، تابع modifyArray مقدار عناصر آرايه a را که به آن فرستاده شده است دو برابر می کند . تابع modifyElement مقدار آرگومان دريافتی را دو برابر کرده و در خروجی چاپ می کند ولی تأثيری در نسخه اصلی عنصر آرايه نداشته و تغييری در مقدار آن ايجاد نمی کند .

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

#include <iostream.h>
 
void tryToModifyArray( const int [] );
 
void main()
{
  int a[] = { 10, 20, 30 };
 
  tryToModifyArray( a );
 
  cout << a[0] <<' '<< a[1] <<' '<< a[2] <<'\n';
 
}
 
// In function tryToModifyArray, "b" cannot be used
// to modify the original array "a" in main.
void tryToModifyArray( const int b[] )
{
  b[ 0 ] /= 2; // error
  b[ 1 ] /= 2; // error
  b[ 2 ] /= 2; // error
}
 
 

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

Error in line 19: Cannot modify a const object
Error in line 20: Cannot modify a const object
Error in line 21: Cannot modify a const object

 


 

 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 
 

حق کپی رایت محفوظ می باشد