جلسه چهاردهم(توابع چند بعدی و اشاره گرها)
آرايه های چند بعدی
آرايه ها در ++C می توانند بيش از يک انديس داشته باشند . بدين صورت يک آرايه چند انديسه يا چند بعدی خواهيم داشت . کاربردی ترين آرايه چند بعدی ، آرايه دو بعدی می باشد که توسط آن می توان جدولی حاوی مقادير مختلف را شبيه سازی کرد . به دستور زير توجه کنيد :
int a[3][4];
دستور فوق يک آرايه دو بعدی 3 در 4 را به صورت زير ايجاد می کند :
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
هر عنصر آرايه به صورت a[i][j]، که در آن i شماره سطر و j شماره ستون می باشد ، قابل دسترسی است .
برای مقدار دهی اوليه به عناصر آرايه می توانيد مانند دستور زير عمل کنيد :
int b[2][2] = {{1,2},{3,4}};
دستور فوق آرايه b را به صورت زير مقدار دهی می کند :
|
1 |
2 |
|
3 |
4 |
در برنامه زير چند نمونه از مقدار دهی اوليه به آرايه دو بعدی 2 در 3 آورده شده است :
#include
void printArray( int [][ 3 ] );
void main()
{
int array1[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };
int array2[ 2 ][ 3 ] = { 1, 2, 3, 4, 5 };
int array3[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };
cout << "Values in array1 by row are:" << endl;
printArray( array1 );
cout << "Values in array2 by row are:" << endl;
printArray( array2 );
cout << "Values in array3 by row are:" << endl;
printArray( array3 );
}
void printArray( int a[][ 3 ] )
{
for ( int i = 0; i < 2; i++ )
{
for ( int j = 0; j < 3; j++ )
cout << a[ i ][ j ] << ' ';
cout << endl;
}
}
خروجی برنامه به صورت زير می باشد :
Values in array1 by row are:
1 2 3
4 5 6
Values in array2 by row are:
1 2 3
4 5 0
Values in array3 by row are:
1 2 0
4 0 0
در برنامه فوق تابع PrintArray وظيفه چاپ عناصر آرايه را بر روی صفحه نمايش دارا می باشد . توجه داشته باشيد که ارسال آرايه به تابع به صورتint a[][3] انجام گرفت . اگر بياد داشته باشيد در آرايه های يک بعدی نيازی به ذکر طول آرايه نبود اما آرايه های بيش از يک بعد تعداد عناصر بعدهای ديگر بايد ذکر شود ، اما نيازی به ذکر طول بعد اول نمی باشد .
مثال : در برنامه زير آرايه 2 بعدی 10 در 10 را با مقادير جدول ضرب ، مقدار دهی می کنيم و سپس آن را بر روی صفحه نمايش چاپ می کنيم .
#include
void main( )
{
int a[10][10],i,j;
for (i=0;i<10;i++)
for (j=0;j<10;j++)
a[i][j]=(i+1)*(j+1);
for (i=0;i<10;i++){
for (j=0;j<10;j++)
cout<
}
}
خروجی برنامه فوق به صورت زير می باشد :
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
تعريف اشاره گر
متغيرهای اشاره گر، آدرس خانه های حافظه را در خود نگهداری می کنند . متغيرها معمولاً مقدار مشخصی را در خود دارند ولی اشاره گرها آدرس يک متغير را در خود دارند . نام يک متغير به طور مستقيم به يک مقدار ، مراجعه می کند اما يک اشاره گر به طور غير مستقيم به يک مقدار مراجعه می .
اشاره گرها نيز مانند هر متغير ديگری ، قبل از استفاده بايد تعريف شوند . به عنوان مثال دستور زير متغير count را از نوع int و متغير countPtr را اشاره گری به متغيری از نوع int تعريف می کند .
int count , *countPtr ;
برای تعريف هر متغيری از نوع اشاره گر ، از علامت ستاره * قبل از نام آن استفاده می کنيم .
به دستور زير توجه کنيد :
double *xPtr , *yPtr ;
در دستور فوق ، xPtr و yPtr اشاره گرهايی به متغيرهايی از نوع double تعريف می شوند .
نکته: استفاده از Ptr در انتهای نام متغيرهای اشاره گر الزامی نمی باشد ولی برای اينکه برنامه قابل فهم تر باشد توصيه می شود از Ptr در انتهای نام اشاره گر استفاده کنيد .
عملگرهای اشاره گر
عملگر آدرس (&) عملگری است که آدرس خانه حافظه عملوند خود را بر می گرداند .
int y=5;
int *yPtr;
yPtr = &y;
دستورات فوق متغير y را از نوع int با عدد 5 مقدار دهی کرده و سپس yPtr ، اشاره گری به متغيری از نوع int تعريف می شود و سرانجام آدرس خانه حافظه y در yPtr قرار می گيرد .
برای آشنايی با نحوه استفاده از اشاره گرها به برنامه زير توجه کنيد :
#include
void main ()
{
int x = 5, y = 15;
int *xPtr, *yPtr;
xPtr = &x;
yPtr = &y;
cout << "The value of x is " << x
<< "\nThe address of x is " << &x
<< "\nThe value of xPtr is " << xPtr;
cout << "\n\nThe value of y is " << y
<< "\nThe address of y is " << &y
<< "\nThe value of yPtr is " << yPtr;
*xPtr = 10;
cout << "\n\nx=" << x << " and y=" << y;
*yPtr = *xPtr;
cout << "\nx=" << x << " and y=" << y;
xPtr = yPtr;
cout << "\nx=" << x << " and y=" << y;
*xPtr = 20;
cout << "\nx=" << x << " and y=" << y;
}
خروجی برنامه فوق به صورت زير می باشد :
The value of x is 5
The address of x is 0x8fb4fff4
The value of xPtr is 0x8fb4fff4
The value of y is 15
The address of y is 0x8fb4fff2
The value of yPtr is 0x8fb4fff2
x=10 and y=15
x=10 and y=10
x=10 and y=10
x=10 and y=20
در برنامه فوق دو متغير x وy از نوع عدد صحيح تعريف شده و x حاوی 5 و y حاوی 15 می گردد سپس xPtr و yPtr اشاره گری به عدد صحيح تعريف می شوند .
xPtr = &x;
yPtr = &y;
دو دستور فوق همانطور که در خروجی برنامه نيز می بيند ، آدرس خانه حافظه x را در xPtr و آدرس خانه حافظه y را در yPtr قرار می دهد .
دستور *xPtr = 10; در خانه ای از حافظه که xPtr اشاره می کند ( يعنی متغير x ) عدد 10 را قرار می دهد سپس*yPtr = *xPtr; مقدار خانه حافظه ای که xPtr به آن اشاره می کند را در خانه ای از حافظه که yPtr به آن اشاره می کند قرار می دهد يعنی مقدار متغير x در متغير y قرار می گيرد .
دستور xPtr = yPtr; مقدار yPtr را که همان آدرس خانه حافظه y می باشد در xPtr قرار می دهد پس با اجرای اين دستور xPtr ديگر به x اشاره نمی کند بلکه به y اشاره خواهد کرد ، لذا با اجرای دستور *xPtr = 20; همانطور که مشاهده می کنيد x حاوی 20 نمی شود بلکه اين مقدار y است که به 20 تغيير می يابد .
تا به حال با دو روش ارسال آرگومانها به توابع آشنا شده ايد . ارسال با مقدار و ارسال با ارجاع . در اين مبحث روش ديگری را که ارسال توسط اشاره گر می باشد مورد بررسی قرار می دهيم . اشاره گرها مانند آرگومانهای ارجاع می توانند برای تغيير يک يا چند متغير ارسال شده از داخل تابع و يا برای ارسال داده های بزرگ به توابع مورد استفاده قرار گيرند . در برنامه زير ، شيوه ارسال آرگومان توسط اشاره گر به تابع مورد استفاده قرار گرفته است .
#include
void callByPointer( int * );
int main()
{
int number = 5;
cout << "The original value of number is " << number;
// pass address of number to callByPointer
callByPointer( &number );
cout << "\nThe new value of number is "
<< number << endl;
return 0;
}
void callByPointer( int *nPtr )
{
*nPtr = *nPtr * *nPtr * *nPtr; // cube *nPtr
}
خروجی برنامه فوق به صورت زير می باشد :
The original value of number is 5
The new value of number is 125