· انتقال آرایه به تابع انتقال آرایه بعنوان آرگومان به یک تابع ، استثنا بر فرم استاندارد فراخوانی با مقدار است . زیرا در اینجا فقط آدرس آرایه به تابع گذر میکند نه کپی تمام عناصر آرایه . وقتی که تابعی با آرگومانی از آرایه فراخوانده میشود یک اشارهگر به اولین عنصر در آرایه ( یعنی آدرس اولین عنصر آرایه) به تابع گذر میکند ( به خاطر داشته باشید که در C نام یک آرایه بدون زیرنویس یا index آن ، یک اشارهگر به اولین عنصر در آرایه است ) . سه روش برای توصیف یا تعریف پارامتری که اشارهگر آرایه را دریافت میکند ، وجود دارد که به شرح زیر بیان میگردد : روش اول - پارامتر مورد نظر بصورت آرایه تعریف میگردد . مانند مثال زیر : #include<stdio.h> void display (int num[10] ) ; main( ) { int a[10] , i ; for ( i = 0 ; i<10 ; + +i ) a [i] = i ; display(a) ; } void display(num) int num[10] ; { int i ; for ( i=0 ; i<10 ; + +i ) printf ("\n %d" , num[i] ) ; } در اینجا با اینکه پارامتر num بصورت یک آرایه 10 عنصری از نوع int توصیف شده است ، C ، بطور اتوماتیک آن را به یک اشارهگر با مقدار صحیح تبدیل میکند . زیرا هیچ پارامتری نمیتواند تمامی یک آرایه را دریافت کند . فقط یک اشارهگر به یک آرایه ، گذر داده میشود . بنابراین باید یک پارامتر اشارهگر ، آن را دریافت کند . روش دوم - راه دوم برای توصیف یک پارامتر آرایه آن است که آن را بعنوان آرایهای معرفی کنیم که اندازه ( تعداد خانههای آن ) مشخص نشده است به شکل زیر : void display (num) int num[ ] ; { for (i= 0 ; i< 10 ; + +i) printf("\n%d" , num[i]) ; } که در آن num بصورت یک آرایه از نوع int و با اندازه نامعلوم معرفی شده است . این روش نیز در واقع num را بعنوان یک اشارهگر int تعریف میکند . روش سوم - راه سوم آن است که num را بعنوان یک اشارهگر int تعریف کنیم که اغلب برنامهنویسان حرفهای این روش را بکار میبرند . این روش در زیر نشان داده شده است : void display (num) int *num ; { int i ; for (i =0 ; i<10 ; + +i) printf ("\n%d" , num [i] (; } که در آن "*" ، عملگر اشارهگر میباشد که این قسمت در فصل مربوط به اشارهگرها ، مورد بحث قرار خواهد گرفت . یک نکته مهم که لازم به یادآوری است ، آن است که وقتی که یک آرایه بعنوان آرگومان یک تابع بکار برده میشود ، آدرس آن به تابع گذر داده میشود . این حالت در زبان C ، یک استثنا بر فراخوانی با مقدار ، در رابطه با قرارداد گذر دادن پارامتر ، محسوب میگردد . بنابراین در مورد آرایهها ، عملیاتی که تابع فرعی روی آرایه انجام میدهد ، در روی محتوای خود آرایه خواهد بود . یعنی در اینجا دیگر ، نسخهای از آرایه به تابع انتقال نمییابد . پس نتیجه عملیات تابع روی آرایهها ، در تابع اصلی ( تابع فراخواننده ) نیز منعکس خواهد شد . · مقداردهی اولیه اشارهگر به متغیرهایی از نوع اشارهگر نیز میتوان هنگام اعلان آنها ، مشابه سایر متغیرها مقدار اولیه نیز نسبت داد و به عبارت دیگر آن را آغازین کرد . به هر حال مقدار اولیه مورد نظر باید یک آدرس باشد . پس یک اشارهگر میتواند ، NULL یا یک آدرس را بهعنوان مقدار اولیه بپذیرد . برای مثال میتوان دستورهایی بصورت زیر نوشت : int x ; int *px = &x ; به هرحال نمیتوان یک متغیر را قبل از اینکه توصیف یا اعلان گردد ، در دستوری بکار برد . بنابراین مجموعه دستورهای زیر غیرقابل قبول است : int *px = &x ; int x ; همچنین میتوان یک اشارهگر را بصورت : int *ptr = 0 ; مقداردهی اولیه کرد که برای مشخص ساختن بعضی شرایط خاص بکار برده میشود . در حالت کلی ، نسبت دادن یک مقدار صحیح به یک متغیر اشارهگر ، دارای مفهوم نیست . به هرحال ، مثال اخیر یک حالت استثناء در این مورد است که همانطور که در بالا بیان شد ، برای مشخص ساختن بعضی شرایط خاص بکار برده میشود . در چنین مواردی توصیه میگردد که یک ثابت سمبولیک مانند NULL را که معرف صفر باشد تعریف نمود و آن را به اشارهگر اختصاص داد . این روش ، تأکید میکند که اختصاص دادن صفر ، معرف یک شرط ویژه میباشد . مثال- یک برنامه به زبان C میتواند تعاریف و عبارات زیر را شامل باشد : # define NULL 0 float x , y ; float *pr = NULL ; در این مثال متغیرهای x و y بصورت متغیرهایی از نوع ممیز شناور و pr بصورت یک متغیر اشارهگر اعلان شده است که مقداری ویژه بهعنوان مقدار اولیه به آن نسبت داده شده است. بنابراین استفاده از ثابت سمبولیک NULL نشان میدهد که این اختصاص مقدار اولیه ، چیزی به غیر از اختصاص مقدار صحیح معمولی است . به هرحال در اغلب کامپایلرهای C ، ثابت سمبولیک NULL در چندین header file و بویژه در <stdio.h> تعریف شده است ، پس اختصاص مقدار اولیه صفر یا NULL به یک اشارهگر ، همارز است ، ولی NULL ترجیح داده میشود . ادامه دارد ....
|