وقتی که تابعی آدرس متغیری را در برنامه فراخواننده آن بداند، میتواند هم مقادیری را در این متغیرها قرار دهد (یعنی مقادیر آنها را تغییر دهد) و هم مقادیر آن متغیرها را به کار برد. بنابراین به کمک اشارهگرها میتوان مقادیر را هم از برنامه فراخواننده به تابع فراخوانده شده و هم از تابع فراخوانده شده به برنامه فراخواننده آن (درواقع در هر دو جهت) گذر داد. البته در مبحث توابع، انتقال مقادیر به روش فراخوانی با مقدار بررسی شد، ولی روش مذکور ما را قادر میسازد که بیش از این مقدار را به برنامه یا تابع فراخواننده برگردانیم و بدین طریق محدودیتی که در برگرداندن نتایج تابع فرعی به کمک نام آن تابع وجود دارد و در آن فقط میتوان یک مقدار را با نام تابع برگرداند از بین برد.
مثال برنامه زیر ضرایب معادله درجه دومی را میخواند و سپس با فراخوانده شدن تابع فرعیای به نام root ریشههای معادله مزبور را محاسبه میکند و به تابع اصلی برمیگرداند. اگر معادله ریشه حقیقی نداشته باشد، تابع فرعی هر دو ریشه را صفر برمیگرداند. در ضمن اگر معادله ریشه داشته باشد، ضرایب معادله همراه با ریشههای آن در تابع اصلی چاپ میشود. در غیر این صورت، ضرایب آن همراه با پیغام مناسب چاپ میشود.
#include <stdio.h>
# include <math.h>
main ()
{
float a , b , c , x1 , x2 ;
scanf (“%f %f %f” , &a , &b , &c) ;
root (a , b , &x1 , &x2) ;
if (x1 = = 0 && x2 = = 0)
printf (“\n %f %f %f no real solution” , a , b , c) ;
else
printf (“\n %f %f %f %f %f” , a , b , cx1 , x2) ;
}
void root (a , b , c , px1 , px2)
float a , b , c , *px1 , *px2 ;
{
float d , delta ;
delta = b*b – 4*a*c ;
if (delta < 0)
{ *px1 = *px2 = 0 ;
return ;
}
else
{ d = sqrt (delta) ;
*px1 = (-b+d) / (2*a) ;
*px2 = (-b-d) / (2*a) ;
return ;
}
}
در فراخوانی تابع root آدرس متغیرهایx2 و x1(که باید ریشههای معادله را بپذیرد) به تابع مذکور گذر داده میشود و سپس در تابع root، اگر معادله دارای ریشههای حقیقی باشد، مقادیر آنها به متغیرهای x2 و x1 نسبت داده میشود (یعنی در محلهایی که آدرس آنها در متغیر اشارهگر px1 و px2 است قرار میگیرد). در غیر این صورت به هر دو متغیر مقدار صفر نسبت داده میشود. بدین طریق بیش از یک مقدار از تابع فرعی به اصلی برگردانده میشود.