میتوان اعضای ساختار یا تمامی ساختار را به تابع گذر داد. راههای مختلفی برای انتقال یا گذر اطلاعات از نوع ساختار به تابع و بالعکس وجود دارد. سازوکار انتقال برحسب اینکه بعضی اعضا یا تمامی ساختار را انتقال دهیم و همچنین برحسب گونههای مختلف C متفاوت است.
اعضا یا عناصر ساختار را میتوان هنگام فراخوانی تابع، به عنوان آرگومان، به آن انتقال داد یا اینکه عضو خاصی از ساختار را با دستور return با تابعی به تابع فراخواننده آن برگرداند. برای انجام این کار، با هریک از اعضای ساختار مشابه متغیری معمولی و تکمقدار برخورد میشود.
مثال شکل کلی برنامه C در زیر نشان داده شده است.
main ()
{
typedef struct { /* structure declaration */
int month ;
int day ;
int year ;
}date ;
suruct { /* structure declaration */
int acct-no ;
char acct-type ;
char name[80] ;
float balance ;
date lastpayment ;
}customer ;
float adjust (char name[ ] , int acct-no , float balance) ;
…
customer.balance = adjust (customer.name , customer.acct-no , customer.balance) ;
…
}
float adjust (char name[ ] , int acct-no , float balance)
{
float newbalance ; /* local variable declaration */
…
newbalance = … ; /* adjust value of balance */
…
return (newbalance) ;
}
این برنامه شیوه انتقال اعضای ساختار به تابع را نمایش میدهد. در اینجا مقادیر
customer.acct-no , customer.name , customer.balance
به تابع adjust گذر داده شدهاند. در داخل تابع مزبور، مقداری که به newbalance اختصاص مییابد احتمالاً از انجام عملیات روی اطلاعات گذر داده شده به دست میآید. سپس این مقدار به تابع اصلی برگردانده میشود که در آن به عضو customer.balance از متغیر ساختار customer اختصاص مییابد.
یادآوری. میتوان تابع پیشنمونه adjust در تابع main() را به صورت زیر نیز توصیف کرد.
float adjust (char[ ] , int , float) ;
به کمک اشارهگر به نوع ساختار میتوان تمامی ساختار را به عنوان آرگومان به تابع انتقال داد. این شیوه، مشابه انتقال آرایه به تابع است. بدیهی است که این روش روش انتقال با آدرس است. بنابراین نتیجه هر عضو ساختار که در درون تابع فراخوانده شده تغییر یابد، در تابع فراخواننده نیز تشخیص داده خواهد شد. لذا باز هم تشابه مستقیم بین این انتقال و آنچه در مورد انتقال آرایه به تابع گفتیم مشاهده میکنید.
مثال برنامه ساده زیر را در نظر بگیرید.
typedef struct {
char *name ;
int acct-no ;
char acct-type ;
float balance ;
} record ;
main () / * transfer a structure-type pointer to a function */
}
void adjust (record *pt) ;
static record customer = {“Nader , 3333 , `c´ , ۳۳٫۳۳} ;
printf (” %s %d %c %.2f \n” , customer.name , customer.acct-no ,
customer.acct-type , customer.balance) ;
adjust (&customer) ;
printf (” %s %d %c %.2f \n” , customer.name , customer.acct-no ,
customer.acct-type , customer.balance) ;
}
void adjust (record *pt)
{
pt-> name = “Payam” ;
pt-> acct-no = 9999 ;
pt-> acct-type = `r´ ;
pt-> balance = 99.99
return ;
}
این برنامه نحوه انتقال ساختار به تابع را با گذر دادن آدرس آن (یعنی اشارهگر به ساختار) به تابع نمایش میدهد.
customer از نوع ساختار است و از لحاظ کلاس حافظه نیز ایستاست ، که به اعضای آن مقادیر اولیه اختصاص داده شده است. ابتدا در تابع اصلی، این مقادیر اولیه اعضای customer با دستور printf نمایش داده میشود. سپس ضمن فراخوانی تابع adjust، آدرس ساختار به آن تابع گذر داده میشود. در تابع مزبور به اعضای customer مقادیر دیگری نسبت داده میشود. ملاحظه میکنید که در این تابع، متغیر pt اشارهگر به ساختار تعریف شده است که آدرس ساختار customer را دریافت میکند. پس از برگشت کنترل به تابع اصلی، برای بار دوم مقدار اعضای customer نمایش داده میشود.
اگر برنامه مزبور اجرا شود، خروجی زیر را مشاهده خواهید کرد.
Nader 3333 c 33.33
Payam 9999 r 99.99