برای ارسال يک آرايه به عنوان آرگومان به يک تابع ، کافيست نام آرايه را بدون
علامت براکت ([]) به کار ببريد . به عنوان مثال اگر آرايه ای با نام
x
به صورت زير تعريف شده باشد :
برای ارسال آن به تابع
modifyArray
کافيست تابع را به صورت زير:
فراخوانی کنيد . دستور فوق آرايه و طول آن را به تابع
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
|