اشارهگرها اغلب به عنوان آرگومان به یک تابع فرستاده میشود. این امر اجازه میدهد که عناصر دادههای برنامه فراخواننده، که معمولاً تابع main است، با تابع فراخوانده شده قابل دستیابی باشند و در داخل تابع فراخوانده شده تغییر یابند و نتیجه در تابع یا برنامه فراخواننده نیز اعمال گردد. این گونه کاربرد اشارهگر، گذر دادن آرگومانها با آدرس و یا گذر دادن آرگومانها با مرجع نامیده میشود.
هنگامی که آرگومانها با مقدار گذر داده میشوند، عناصر داده (مقدار داده) به تابع کپی میشوند. بنابراین هر گونه تغییرات اعمال شده در روی آنها در درون تابع یا روتین فراخواننده اثر نمیگذارد. اما وقتی که آرگومان به صورت آدرس انتقال مییابد (یعنی وقتی که اشارهگر به تابع گذر داده میشود)، در واقع آدرس آن قلم از داده به تابع فرستاده میشود. حال محتوای آن آدرس به راحتی هم در درون تابع مزبور و هم در تابع فراخواننده قابل دستیابی است. بهعلاوه هر تغییراتی که روی آن قلم داده انجام پذیرد (یعنی هر گونه تغییراتی که در محتوای آدرس مورد نظر انجام گیرد) هم در تابع فراخوانده شده و هم در برنامه یا تابع فراخواننده تأثیر میگذارد و تشخیص داده میشود.
دو برنامه نمایش داده شده در مثالهای ۸ـ۸ و ۸ـ۹ دو گونه از تابعی به نام add را نشان میدهد که آرگومان خود را یک واحد افزایش میدهد. مثال ۸ـ۸ متغیر count را با روش فراخوانی با مقدار، به تابع گذر میدهد. تابع add آرگومان خود را یک واحد افزایش میدهد و مقدار جدید را با دستور return به تابع main برمیگرداند. مقدار جدید در تابع main به count نسبت داده میشود. در مثال ۸ـ۹، برنامه مورد نظر متغیر count را با فراخوانی آدرس گذر میدهد؛ یعنی آدرس count (نه مقدار آن) به تابع add گذر داده میشود. تابع add1 اشارهگری به مقدار صحیح را که در اینجا countptr نامیده شده است به عنوان آرگومان دریافت میکند. تابع add مقداری را که با countptr به آن اشاره شده است (یعنی محتوای محلی را که آدرس آن در اشارهگر countptr قرار دارد) یک واحد افزایش میدهد. این عمل همچنین مقدار count را در main تغییر میدهد.
مثال مقدار متغیر با به کار بردن فراخوانی با مقدار افزایش مییابد.
#include <stdio.h>
main ()
{
int count = 7 ;
int add(int) ;
printf (“the original value of count is %d\n” , count) ;
count = add (count) ;
printf (“the new value of count is %d\n” , count) ;
}
int add(int c)
{
return ++c ; \* incrementsl variable c */
}