66
ه ت ف ر ش ی پ ی ه ساز م ا رن ب ه ت ف ر ش ی پ ی ه ساز م ا رن ب رها گ ازه م – اس ت ش ه ل ص ف رها گ ازه م – اس ت ش ه ل ص ف( ( pointers pointers ’’’’) ’’’’) : : ر: گ ازه اس ر: گ ازه اس ی دازد. م گه ن ود خ ری زا دز گ2 ن ر د2 ی غ ت م دزس9 که ا ت س ری ا2 ی غ ت م ی دازد. م گه ن ود خ ری زا دز گ2 ن ر د2 ی غ ت م دزس9 که ا ت س ری ا2 ی غ ت م ر، گ ازه اس ر، گ ازه اس د. ن ک ی م ازه ر اس گ2 ن ر د2 ی غ ت م دزس9 ه ا ب د. ن ک ی م ازه ر اس گ2 ن ر د2 ی غ ت م دزس9 ه ا ب ر گ ازه داز اس ق م ر گ ازه داز اس ق م. ت س ه اE ظ حاف ه از اب حH ک2 پ دزس9 ، ا. ت س ه اE ظ حاف ه از اب حH ک2 پ دزس9 ، ا ر، گ ازه اس ر، گ ازه اس. ت س ا ها داده ه ی ب س ر سی م د2 ت ق ت ش م ر2 ی غ زوسH ک2 پ. ت س ا ها داده ه ب ی س ر سی م د2 ت ق ت ش م ر2 ی غ زوسH ک2 پ ه : ت ک ن ه : ت ک نازد د ود ن خ ر و گ ازه د اس نP ن ی ما م و ه ف م ی س2 ی و ن امه رن ب ی م2 ی د های ق ن ا ن رز کی دز اازد د ود ن خ ر و گ ازه د اس نP ن ی ما م و ه ف م ی س2 ی و ن امه رن ب ی م2 ی د های ق ن ا ن رز کی دز ا ان ن ز ازز ی ن گ ر2 ب ی و ل و ان ن ز ازز ی ن گ ر2 ب ی و ل وC C ام ج ن و ا رها گ ازه اس د از عد ت م اده ق ت س ا ام ج ن و ا رها گ ازه اس د از عد ت م اده ق ت س ا. ت س ا ها ن9 زوی ا ی ت ا ن س جا م ات2 ن ل م ع. ت س ا ها ن9 زوی ا ی ت ا ن س جا م ات2 ن ل م ع

برنامه سازی پیشرفته

  • Upload
    sibyl

  • View
    65

  • Download
    0

Embed Size (px)

DESCRIPTION

برنامه سازی پیشرفته. فصل هشتم – اشاره گرها (pointers) : اشاره گر: متغیری است که آدرس متغیر دیگری را در خود نگه می دارد. اشاره گر، به آدرس متغیر دیگر اشاره می کند. مقدار اشاره گر ، آدرس یک خانه از حافظه است. اشاره گر، یک روش غیرمستقیم دسترسی به داده ها است. - PowerPoint PPT Presentation

Citation preview

Page 1: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته::((pointerspointers))فصل هشتم – اشاره گرها فصل هشتم – اشاره گرها

متغیری است که آدرس متغیر دیگری را در خود متغیری است که آدرس متغیر دیگری را در خود اشاره گر:اشاره گر:نگه می دارد.نگه می دارد.

به آدرس متغیر دیگر اشاره می کند. به آدرس متغیر دیگر اشاره می کند.اشاره گر،اشاره گر،

، آدرس یک خانه از حافظه است. ، آدرس یک خانه از حافظه است.مقدار اشاره گرمقدار اشاره گر

یک روش غیرمستقیم دسترسی به داده ها یک روش غیرمستقیم دسترسی به داده ها اشاره گر،اشاره گر، است. است.

در اکثرزبانهای قدیمی برنامه نویسی مفهومی مانند در اکثرزبانهای قدیمی برنامه نویسی مفهومی مانند نکته :نکته : استفاده استفاده CCاشاره گر وجود ندارد ولی ویژگی بارز زباناشاره گر وجود ندارد ولی ویژگی بارز زبان

متعدد از اشاره گرها و انجام عملیات محاسباتی روی متعدد از اشاره گرها و انجام عملیات محاسباتی روی آنها است . آنها است .

Page 2: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته: موارد کاربرد اشاره گرها :موارد کاربرد اشاره گرها

انتقال آدرس متغیرها به تابع فرعی انتقال آدرس متغیرها به تابع فرعی ( (11

برگرداندن چندین مقدار از تابع فرعی برگرداندن چندین مقدار از تابع فرعی((22

دستیابی به عناصرآرایه ها دستیابی به عناصرآرایه ها((33

تشکیل ساختارهای پیچیده تر مثل تشکیل ساختارهای پیچیده تر مثل ((44فهرستهای پیوندی ، درختها و نمودارهافهرستهای پیوندی ، درختها و نمودارها

عمل تخصیص حافظه بصورت پویا عمل تخصیص حافظه بصورت پویا((55

Page 3: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته دوعملگر یا اپراتوری که دراشاره گرها استفاده دوعملگر یا اپراتوری که دراشاره گرها استفاده

. .’’&& ’’ و و ’’ ** ‘‘می شوند عبارتند از می شوند عبارتند از

عملگری یکانی است که آدرس عملگری یکانی است که آدرس ’’ & &’’عملگر عملگر عملوند خود را مشخص می کند .عملوند خود را مشخص می کند .

عملگری یکانی است که محتویات عملگری یکانی است که محتویات ’’ * * ‘‘عملگر عملگر آدرس حافظه را مشخص می کند . آدرس حافظه را مشخص می کند .

Page 4: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته:نحوه معرفی اشاره گرها:نحوه معرفی اشاره گرها

برای استفاده از اشاره گر باید اول آنرا تعریف کرد. برای استفاده از اشاره گر باید اول آنرا تعریف کرد.

شکل کلی تعریف اشاره گرها بصورت زیر است :شکل کلی تعریف اشاره گرها بصورت زیر است :

data-typedata-type * * ptvarptvar ; ;

data-typedata-type نوع متغیری است که آدرس آن در نوع متغیری است که آدرس آن درقرار می گیرد.قرار می گیرد.ptvarptvar متغیر اشاره گر متغیر اشاره گر

ptvarptvar . نام متغیرموردنظراست . نام متغیرموردنظراست

نیز نماد اپراتور اشاره گر است . نیز نماد اپراتور اشاره گر است . ’’ ** ’’

Page 5: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته: انواع متغیرهای اشاره گر :انواع متغیرهای اشاره گر

اشاره گر به متغیر عددی اشاره گر به متغیر عددی((11

اشاره گر به متغیر کاراکتری اشاره گر به متغیر کاراکتری((22

اشاره گر به آرایه ها اشاره گر به آرایه ها((33

اشاره گر به توابع اشاره گر به توابع((44

اشاره گر به ساختارها اشاره گر به ساختارها((55

اشاره گر به اشاره گر اشاره گر به اشاره گر ((66

Page 6: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته در حالت کلی هر نوع داده ذخیره شده در در حالت کلی هر نوع داده ذخیره شده در

حافظه ، یک یا چند بایت متوالی از خانه های حافظه ، یک یا چند بایت متوالی از خانه های حافظه را اشغال می کند.حافظه را اشغال می کند.

درصورتی می توان به داده دسترسی داشت درصورتی می توان به داده دسترسی داشتکه آدرس اولین خانه یا اولین بایت آن را در که آدرس اولین خانه یا اولین بایت آن را در

حافظه بدانیم .حافظه بدانیم .آدرس متغیرآدرس متغیر aa در حافظه با در حافظه با&&aa تعیین میشود تعیین میشود

اپراتور یکانی آدرس نام دارد و آدرس اپراتور یکانی آدرس نام دارد و آدرس &&که که عملوند خود را به دست می دهد.عملوند خود را به دست می دهد.

Page 7: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته اگر متغیر اگر متغیر aaاز نوعاز نوع intint ومتغیر ومتغیرpapa نیز متغیر اشاره نیز متغیر اشاره

گر بوده و بصورت زیر توصیف شده باشد:گر بوده و بصورت زیر توصیف شده باشد:

int *paint *pa ; ;

آدرس آدرس pa=&apa=&a در اینصورت با دستور جایگذاری در اینصورت با دستور جایگذاری نسبت داده میشود . نسبت داده میشود . papaبه اشاره گر به اشاره گر aa متغیر متغیر

PaPa را اشاره گر را اشاره گر aa می نامند ، زیرا به محلی از حافظه می نامند ، زیرا به محلی از حافظهدر آن ذخیره شده در آن ذخیره شده aaاشاره می کند که مقدار متغیر اشاره می کند که مقدار متغیر

است .است .

را معرفی می کند نه مقدار را معرفی می کند نه مقدار aa آدرس متغیر آدرس متغیر papa نکته : نکته : نامند . نامند .متغیر اشاره گرمتغیر اشاره گرآن را به همین دلیل آن را آن را به همین دلیل آن را

Page 8: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته رابطه بین رابطه بین papa و وaa : در شکل زیر نشان داده شده است :در شکل زیر نشان داده شده است رابطه بین رابطه بین papa و وaa : در شکل زیر نشان داده شده است :در شکل زیر نشان داده شده است

a مقدار a آدرس

pa

Page 9: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته داده ای که با داده ای که باaa معرفی می شود با عبارت معرفی می شود با عبارت **papa در در

اپراتور یکانی است اپراتور یکانی است **دسترس قرار می گیرد که در آن دسترس قرار می گیرد که در آن که فقط روی متغیرهایی از نوع اشاره گر عمل می کند .که فقط روی متغیرهایی از نوع اشاره گر عمل می کند .

aaوو **papa هردو محتوای خانه های یکسان از حافظه را هردو محتوای خانه های یکسان از حافظه رامعرفی می کنند .معرفی می کنند .

با اجرای دو دستور با اجرای دو دستورpa=&apa=&a ; ;k=*pak=*pa ; ;

kk و و aa هردو یک مقدار را معرفی خواهند کرد . یعنی مقدار هردو یک مقدار را معرفی خواهند کرد . یعنی مقدار aa به طور غیرمستقیم به به طور غیرمستقیم به kk .نسبت داده خواهد شد. نسبت داده خواهد شد

نتیجه هر دو دستور فوق مشابه نتیجه دستور انتسابنتیجه هر دو دستور فوق مشابه نتیجه دستور انتسابk=ak=a است. است.

Page 10: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهدر مورد در مورد **عملگرعملگر **papa محتوای محلی را برمی محتوای محلی را برمی

قرار دارد ، به همین قرار دارد ، به همین papa گرداند که آدرس آن در گرداند که آدرس آن در هم می نامند . هم می نامند .”عملگر غیرمستقیم“”عملگر غیرمستقیم“دلیل آن را دلیل آن را

**papa در سمت چپ دستور انتساب نیز می تواند در سمت چپ دستور انتساب نیز می تواند ظاهر شود . مثال اگر داشته باشیم :ظاهر شود . مثال اگر داشته باشیم :

pch=&chpch=&ch ; ;

*pch=*pch=‘‘ b b ‘‘ ; ;

نسبت نسبت chchبه متغیر به متغیر bbبا اجرای دستور دوم کاراکتربا اجرای دستور دوم کاراکترداده می شود . داده می شود .

Page 11: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهآدرس داده ها:آدرس داده ها:

هر متغیر دارای یک آدرس منحصر به فرد است که محل هر متغیر دارای یک آدرس منحصر به فرد است که محلآن را در حافظه مشخص می کند و گاه بهتر است برای آن را در حافظه مشخص می کند و گاه بهتر است برای دست یابی به متغیر در عوض نام متغیر ، از آدرس آن دست یابی به متغیر در عوض نام متغیر ، از آدرس آن

استفاده شود .استفاده شود .یا یا && برای بدست آوردن آدرس متغیر ، از اپراتوربرای بدست آوردن آدرس متغیر ، از اپراتور

( ( ampersandampersand .استفاده می شود ).استفاده می شود ) مثال اگر متغیر مثال اگر متغیر kk از نوع از نوعlong intlong int معرفی و آدرس آن معرفی و آدرس آن

10041004 مقدار مقدار ; ;ptr=&Aptr=&Aباشد، با اجرای دستور باشد، با اجرای دستور 10041004ذخیره می شود که البته ذخیره می شود که البته ptrptr ( در متغیر ( در متغیر AA )آدرس متغیر )آدرس متغیر

باید از نوع اشاره گر توصیف شده باشد که به باید از نوع اشاره گر توصیف شده باشد که به ptrptr متغیر متغیر اشاره می کند . اشاره می کند . longlong intintمتغیری از نوع متغیری از نوع

Page 12: برنامه سازی پیشرفته

را چاپ می را چاپ می AAبرنامه زیر مقدار و آدرس متغیر برنامه زیر مقدار و آدرس متغیر 162162 صفحه صفحه 11--88مثال مثال کند.کند.

#include<stdio.h>#include<stdio.h>

main ) (main ) (

{{

int A=5 ;int A=5 ;

printf)printf)““ The value of A is : %d\n The value of A is : %d\n””,A( ;,A( ;

printf)printf)““ The address of A is :%p\n The address of A is :%p\n”” , &A(; , &A(;

}} استفاده شده خروجی استفاده شده خروجی pp%% از کدفرمت از کدفرمت printfprintfتوضیح : در تابع توضیح : در تابع

برنامه بصورت زیر است برنامه بصورت زیر است

The vaue of A is : 5The vaue of A is : 5

The address of A is : 1004The address of A is : 1004

Page 13: برنامه سازی پیشرفته

قطعه برنامه فوق را بصورت زیر هم می توان قطعه برنامه فوق را بصورت زیر هم می تواننوشت:نوشت:

#include<stdio.h>#include<stdio.h>

main ) (main ) (

{{

int A=5 ;int A=5 ;

int *pA ;int *pA ;

pA =&A ;pA =&A ;

printf)printf)““ The address of A is : %p\n The address of A is : %p\n”” , pA(; , pA(;

}}

Page 14: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته موارد استفاده ازعملگرستاره موارد استفاده ازعملگرستاره ‘‘ * * ’’ برای معرفی متغیرهای عملگر ) در سمت برای معرفی متغیرهای عملگر ) در سمت ((11

چپ متغیر ( مانند:چپ متغیر ( مانند: int *p1 , *p2 , *p3int *p1 , *p2 , *p3 ;; float *p4 , *p5 ;float *p4 , *p5 ;

جهت دست یابی به مقدار متغیری که جهت دست یابی به مقدار متغیری که ((22 آدرس آن در متغیر اشاره گر قرار دارد ، آدرس آن در متغیر اشاره گر قرار دارد ،

مانند :مانند : p1=&a ;p1=&a ; *p1=a ;*p1=a ;

Page 15: برنامه سازی پیشرفته

به برنامه زیر توجه کنید به برنامه زیر توجه کنید163163 صفحه صفحه 22--88مثال مثال

#include<stdio.h>#include<stdio.h>

main) (main) (

{ {

char *pch ;char *pch ;

char ch1=char ch1=‘‘ZZ’’ , ch2 ; , ch2 ;

printf)printf)““the address of pch is%pthe address of pch is%p””,&pch(;,&pch(;

pch=&ch1 ;pch=&ch1 ;

printf)printf)““the value stored at pch is %p\the value stored at pch is %p\nn””,pch( ;,pch( ;

printf)printf)““the value stored at the address pointed by pch is %c\nthe value stored at the address pointed by pch is %c\n”” , , *pch( ;*pch( ;

Page 16: برنامه سازی پیشرفته

ch2=*pch ;ch2=*pch ; printf)printf)““the value stored at ch2 is%c\nthe value stored at ch2 is%c\n”” ,ch2( ; ,ch2( ; }}

توضیح :توضیح : اشاره گری به متغیرهایی از نوع کاراکتر توصیف اشاره گری به متغیرهایی از نوع کاراکتر توصیف pchpch دراین برنامه متغیر دراین برنامه متغیرنیز از نوع کاراکتر اعالن شده اند که به نیز از نوع کاراکتر اعالن شده اند که به ch2ch2ووch1ch1شده متغیرهای شده متغیرهای

را نسبت می دهد.را نسبت می دهد.’’aa‘‘مقدار اولیه کاراکتر مقدار اولیه کاراکتر ch1ch1متغیرمتغیرچاپ می گردد که به فرض چاپ می گردد که به فرض pchpchاول آدرس متغیر اول آدرس متغیر printfprintfدر دستور در دستور نسبت داده میشود.نسبت داده میشود.pchpchبه به ch1ch1 است. سپس آدرس متغیر است. سپس آدرس متغیر10041004

20012001(که به فرض(که به فرضch1ch1)آدرس متغیر)آدرس متغیرpchpchدوم مقداردوم مقدارprintfprintfدر دستور در دستور است چاپ میشود.است چاپ میشود.

سوم محتوای خانه ای از حافظه که آدرس آن در متغیر سوم محتوای خانه ای از حافظه که آدرس آن در متغیر printfprintfدر دستور در دستور pchpchیعنی مقدار متغیر( یعنی مقدار متغیرقراردارد( قرارداردch1ch1 و کاراکتر ) و کاراکتر )‘‘aa’’است چاپ میشوداست چاپ میشود

نسبت داده نسبت داده ch2ch2( به متغیر ( به متغیر ’’aa‘‘در خط بعد همین مقدار )یعنی حرف در خط بعد همین مقدار )یعنی حرف میشود.میشود.است ( است ( ’’aa‘‘ )که همان حرف )که همان حرف ch2ch2 آخری مقدار متغیر آخری مقدار متغیر printfprintfبا دستور با دستور

چاپ میشود چاپ میشود

Page 17: برنامه سازی پیشرفته

خروجی این برنامه بصورت زیر است :خروجی این برنامه بصورت زیر است :

the address of pch is 1004the address of pch is 1004

the value stored at pch is 2001the value stored at pch is 2001

the value stored at the address pointed by pch the value stored at the address pointed by pch is Zis Z

the value stored at ch2 is Zthe value stored at ch2 is Z

Page 18: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهمقدار دهی اولیه به اشاره گر :مقدار دهی اولیه به اشاره گر :

به هر متغیر از نوع اشاره گرنیز می توان هنگام به هر متغیر از نوع اشاره گرنیز می توان هنگاماعالن آنها ، مقدار اولیه نسبت داد . در این صورت اعالن آنها ، مقدار اولیه نسبت داد . در این صورت

مقدار اولیه مورد نظر باید یک آدرس باشد.مقدار اولیه مورد نظر باید یک آدرس باشد. اشاره گر اشاره گر NULLNULL یا یک آدرس را به عنوان مقدار یا یک آدرس را به عنوان مقدار

اولیه می پذیرد. مثال :اولیه می پذیرد. مثال :

int xint x ; ;

int *px=&xint *px=&x ; ;

Page 19: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته نمی توان متغیری را قبل از این که توصیف یا نمی توان متغیری را قبل از این که توصیف یا

اعالن گردد در دستوری به کاربرد . پس اعالن گردد در دستوری به کاربرد . پس دستورات زیر قابل قبول نیست :دستورات زیر قابل قبول نیست :

int *px=&x int *px=&x ;;

int xint x ; ; برای بعضی مواردویژه می توان اشاره گررا برای بعضی مواردویژه می توان اشاره گررا

به صورت زیر هم مقداردهی اولیه کرد :به صورت زیر هم مقداردهی اولیه کرد :

int *ptr=0int *ptr=0 ; ;

Page 20: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته درحالت کلی نسبت دادن مقدار صحیح به متغیر اشاره درحالت کلی نسبت دادن مقدار صحیح به متغیر اشاره

گر مفهوم ندارد .در چنین مواردی توصیه می شود که گر مفهوم ندارد .در چنین مواردی توصیه می شود که را که معرف صفر باشد را که معرف صفر باشد NULLNULL ثابت سمبولیکی مانند ثابت سمبولیکی مانند

تعریف و آن را به اشاره گر اختصاص داد .تعریف و آن را به اشاره گر اختصاص داد . این روش تاکید می کند که اختصاص دادن صفر، معرف این روش تاکید می کند که اختصاص دادن صفر، معرف

شرایط خاصی است .شرایط خاصی است . در اغلب کامپایلرهای در اغلب کامپایلرهایCC ثابت سمبولیک ثابت سمبولیک NULLNULL در چندین در چندین

header fileheader file وبویژه در وبویژه در >>stdio.hstdio.h<<. تعریف شده است .تعریف شده است اختصاص دادن مقدار اولیه صفر یا اختصاص دادن مقدار اولیه صفر یاNULLNULL به یک اشاره به یک اشاره

گر، گر،

ترجیح داده می شود.ترجیح داده می شود.NULLNULL هم ارز هستند ولی هم ارز هستند ولی

Page 21: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته ::( ( NULLNULL ) )اشاره گرتهی اشاره گرتهی

اشاره تهی ، اشاره گری است که به هیچ چیز اشاره تهی ، اشاره گری است که به هیچ چیز قابل قبول یا معتبری اشاره نمی کند یا مقدار قابل قبول یا معتبری اشاره نمی کند یا مقدار

صحیح صفر به آن نسبت داده شده باشد.صحیح صفر به آن نسبت داده شده باشد. اشاره گر تهی بویژه دردستورهای مربوط به اشاره گر تهی بویژه دردستورهای مربوط به

کنترل جریان مفید است ، چون اشاره گرهایی با کنترل جریان مفید است ، چون اشاره گرهایی با درنظرگرفته می شوند ، درنظرگرفته می شوند ، falsefalseمقدارصفر مقدارصفر

درحالی که متغیرهای اشاره گر با سایر مقادیر درحالی که متغیرهای اشاره گر با سایر مقادیر truetrue. منظور می گردند . منظور می گردند

Page 22: برنامه سازی پیشرفته

تا موقعی تا موقعی whilewhile در برنامه زیر حلقه در برنامه زیر حلقه 166166 صفحه صفحه 55--88مثال مثال نباشد ، عمل تکرار ادامه می دهد. نباشد ، عمل تکرار ادامه می دهد.NULLNULLکه اشاره گر که اشاره گر

char *p ;char *p ;

………….;.;

………….;.;

while)p( while)p(

{{

………….;.;

…………;;

}}توضیح : این گونه کاربرد اشاره گرها بویژه در کاربردهایی آشکار توضیح : این گونه کاربرد اشاره گرها بویژه در کاربردهایی آشکار

می گردد که آرایه هایی از اشاره گرها را به کار می برد.می گردد که آرایه هایی از اشاره گرها را به کار می برد.

Page 23: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته انواع عملیاتی که روی اشاره گرها انجام پذیر انواع عملیاتی که روی اشاره گرها انجام پذیر

است :است :

انتساب یا جایگذاریانتساب یا جایگذاریالف( الف(

محاسباتی شامل جمع و تفریق و محاسباتی شامل جمع و تفریق و اعمالاعمال ب( ب( ++ و- - ++ و- -

مقایسه اشاره گرهامقایسه اشاره گرها ج( ج(

Page 24: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهالف ( انتساب :الف ( انتساب :

درمورد اشاره گرها هم مانند سایر متغیرها می درمورد اشاره گرها هم مانند سایر متغیرها میتوان مقداری را به متغیر نسبت داد ولی این توان مقداری را به متغیر نسبت داد ولی این

عمل مانند سایر متغیرها گسترده نیست .عمل مانند سایر متغیرها گسترده نیست . به متغیر اشاره گر می توان آدرس متغیر یا به متغیر اشاره گر می توان آدرس متغیر یا

مقدار صفر نسبت داد.مقدار صفر نسبت داد.

Page 25: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهب( محاسبه :ب( محاسبه :

عملیات مخاسباتی روی اشاره گرها ، شامل چهار عملیات مخاسباتی روی اشاره گرها ، شامل چهارعمل عمل

می باشد. می باشد.- -- -و و ++ ++ ، ، --، ، + + اگر دو متغیر اشاره گر از یک نوع باشند ، یعنی اگر دو متغیر اشاره گر از یک نوع باشند ، یعنی

اشیایی که اشاره گرهای فوق به آن اشاره می کنند اشیایی که اشاره گرهای فوق به آن اشاره می کنند یکسان باشد، می توان مقادیر آن دو اشاره گر را از یکسان باشد، می توان مقادیر آن دو اشاره گر را از

هم تفریق کرد. هم تفریق کرد. مثال مقدار مثال مقدار&&a[0]a[0] &a[3]&a[3] –– خواهد بود. خواهد بود. 33برابر برابر درواقع تفاضل فوق تعداد اشیاء بین این دو اشاره گر درواقع تفاضل فوق تعداد اشیاء بین این دو اشاره گر

را معرفی می کند .را معرفی می کند .

Page 26: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته می توان مقدار صحیحی را به اشاره گرها اضافه یا می توان مقدار صحیحی را به اشاره گرها اضافه یا

از آن کسر کرد ولی باید به مفهوم آن توجه نمود.از آن کسر کرد ولی باید به مفهوم آن توجه نمود. مثال مثال p+5p+5 به پنج شی بعد از شیی که به پنج شی بعد از شیی کهpp به آن به آن

اشاره می کند اشاره خواهد کرد.اشاره می کند اشاره خواهد کرد. اگر اگرpp متغیری از نوع متغیری از نوع short intshort int بوده باشد که بوده باشد که

p+5p+5 دوبایت از حافظه را اشغال می کند ، عبارتدوبایت از حافظه را اشغال می کند ، عبارتمعرف آن است معرف آن است pp بایت بعد از آدرسی که بایت بعد از آدرسی که 1010به به

( اشاره خواهد کرد. ( اشاره خواهد کرد. 55××22==1010)) اگر اگرppمتغیری از نوع متغیری از نوع آدرس آدرس floatfloat بوده باشد بوده باشدp+5p+5

( اشاره خواهد کرد .( اشاره خواهد کرد .55××44==2020 بایت بعد ) بایت بعد )2020به به

Page 27: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهP+5P+5 شئ بعد از شئ بعد از 55” اندازه ” اندازه همیشه به مفهوم همیشه به مفهوم

خواهد بود . خواهد بود .اشاره می کند ”اشاره می کند ”pp شیئی که شیئی که را در بزرگی یا طول شئ مورد نظر را در بزرگی یا طول شئ مورد نظر 55کامپایلر کامپایلر

اضافه می اضافه می ppضرب می کند و آن را به محتوای ضرب می کند و آن را به محتوای کند تا آدرس جدید بدست آید .کند تا آدرس جدید بدست آید .

Page 28: برنامه سازی پیشرفته

به برنامه زیر توجه کنید به برنامه زیر توجه کنید167167 صفحه صفحه 66--88مثال مثال ##include<stdio.h>include<stdio.h> main) (main) ( {{ int *px , *py ;int *px , *py ; static int A[6]={1,2,3,4,5,6} ;static int A[6]={1,2,3,4,5,6} ; px=&A[0] ;px=&A[0] ; py=&A[5] ;py=&A[5] ; printf)printf)““px=%x py=%xpx=%x py=%x”” ,px ,py( ; ,px ,py( ; printf)printf)““\n \n py-px=%xpy-px=%x”” ,py-px( ; ,py-px( ; }}

که از نوع که از نوع printfprintf توضیح : با توجه به کاراکتر فرمت در دستور توضیح : با توجه به کاراکتر فرمت در دستور %%xx تعریف شده است ، خروجی دستور تعریف شده است ، خروجی دستور printfprintf اول آدرس دو اول آدرس دو

برحسب هگزا دسیمال خواهد بود . برحسب هگزا دسیمال خواهد بود . pypyووpxpxمتغیر متغیر برحسب هگزا برحسب هگزا pypyووpxpxدوم اختالف دوم اختالف printfprintf خروجی دستور خروجی دستور

1010((55=)=)1616((55))را چاپ خواهد کرد . را چاپ خواهد کرد . ((55))دسیمالدسیمال

Page 29: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته ج( مقایسه : ج( مقایسه :

متغیرهای اشاره گر را که هردو از یک نوع متغیرهای اشاره گر را که هردو از یک نوعمشابه باشند می توان با هم مقایسه کرد . مشابه باشند می توان با هم مقایسه کرد .

یعنی دواشاره گر را می توان در یک عبارت یعنی دواشاره گر را می توان در یک عبارترابطه ای با یکدیگر مقایسه کرد .رابطه ای با یکدیگر مقایسه کرد .

Page 30: برنامه سازی پیشرفته

اشاره گرهایی باشند که به اشاره گرهایی باشند که به pypyوو pxpx اگر اگر 168168 صفحه صفحه 77--88مثال مثال عناصری از یک آرایه اشاره می کنند چند عبارت منطقی حاصل عناصری از یک آرایه اشاره می کنند چند عبارت منطقی حاصل

از آنها به این شکل خواهد بود :از آنها به این شکل خواهد بود :

px<pypx<py

px>=pypx>=py

px==py px==py

px !=pypx !=py

px==nullpx==null

همچنین دستورات زیر درست است : همچنین دستورات زیر درست است :

if)px<py(if)px<py(

printf)printf)““px points to lower memory than pypx points to lower memory than py””(;(;

elseelse

printf)printf)““px points to upper memory than pypx points to upper memory than py””(;(;

Page 31: برنامه سازی پیشرفته

ویژگی های اشاره گرها :ویژگی های اشاره گرها :

عمل تخصیص حافظه بصورت پویا را ممکن می کنند عمل تخصیص حافظه بصورت پویا را ممکن می کنندالف(الف(

کار با آرایه ها و رشته ها را آسان می کنند کار با آرایه ها و رشته ها را آسان می کنندب (ب (

موجب بهبود کارایی بسیاری از توابع میشوند موجب بهبود کارایی بسیاری از توابع میشوند ج ( ج (

فراخوانی با آدرس را در مورد توابع ممکن می کنند و فراخوانی با آدرس را در مورد توابع ممکن می کنند و د (د ( در نتیجه برگردان بیش از یک مقدار از یک تابع میسر می در نتیجه برگردان بیش از یک مقدار از یک تابع میسر می

شود .شود .

برای تعریف اشاره گرهایی که به برای تعریف اشاره گرهایی که به farfar کلمه کلیدی کلمه کلیدی – –11نکته نکته ذخیره بیش از دو بایت نیاز دارند به کار می رود و قبل از ذخیره بیش از دو بایت نیاز دارند به کار می رود و قبل از

نام متغیر اشاره گر و بعد از تعیین نوع اصلی ذکر می نام متغیر اشاره گر و بعد از تعیین نوع اصلی ذکر می شود مانند شود مانند

char far *ptrchar far *ptr ; ;

برای تعریف اشاره گرهایی که برای تعریف اشاره گرهایی که hugehuge کلمه کلیدی کلمه کلیدی – –22نکته نکته را در خود ذخیره می کنند به را در خود ذخیره می کنند به بیت بیت1616آدرس هایی بیش از آدرس هایی بیش از

کار می رود .کار می رود .

Page 32: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته انتقال مقادیر به تابع : انتقال مقادیر به تابع :

وقتی مقادیری را به یک تابع انتقال می دهیم ، آنها وقتی مقادیری را به یک تابع انتقال می دهیم ، آنها بطور جداگانه )به صورت دوبله ( در فضای حافظه بطور جداگانه )به صورت دوبله ( در فضای حافظه

ذخیره می شوند .ذخیره می شوند . تابع می تواند به مقادیر اسامی متفاوتی را که فقط در تابع می تواند به مقادیر اسامی متفاوتی را که فقط در

تابع مزبور شناخته شده است اختصاص دهد . تابع مزبور شناخته شده است اختصاص دهد . تابع می تواند روی متغیر های جدید بدون آنکه تاثیری بر تابع می تواند روی متغیر های جدید بدون آنکه تاثیری بر

روی متغیرهای اصلی داشته باشد هر عملی را انجام دهد روی متغیرهای اصلی داشته باشد هر عملی را انجام دهد .. اسامی می توانند یکسان هم باشند که در اینصورت باز اسامی می توانند یکسان هم باشند که در اینصورت باز

در شیوه کار تغییری حاصل نمی شود .در شیوه کار تغییری حاصل نمی شود .

Page 33: برنامه سازی پیشرفته

را به را به 77 و و 44 برنامه زیر دو مقدار صحیح برنامه زیر دو مقدار صحیح 168168مثال صفحه مثال صفحه می فرستد می فرستد getsgets22 تابعی به نام تابعی به نام

main) (main) (

{{

int x=4 , y=7 ;int x=4 , y=7 ;

gets2)x,y( ;gets2)x,y( ;

}}Void gets2)xx , yy( Void gets2)xx , yy( /*printout values of two /*printout values of two

arguments */arguments */

Int xx , yy ;Int xx , yy ;

{{

printf)printf)““first is %d , secind is %dfirst is %d , secind is %d”” , xx,yy ( ; , xx,yy ( ;

}}

Page 34: برنامه سازی پیشرفته

ساز وکار انتقال مقادیر به تابع ساز وکار انتقال مقادیر به تابع

44xx

77yy

main)(

{

int x=4 ;

int y=7 ;

gets2)x,y( ;

….………….

}

44xxxx

77yyyy

gets2)xx,yy(

int xx , yy ;

{

printf)“first is%d , second is%d”,xx ,yy(

}

Page 35: برنامه سازی پیشرفته

تفاوت بین آرگومانهای معمولی و تفاوت بین آرگومانهای معمولی و 171171 صفحه صفحه 1010--88مثال مثال اشاره گراشاره گر

#include<stdio.h>#include<stdio.h>

main( )main( )

{{

int u=1 ;int u=1 ;

int v=3 ;int v=3 ;

void func1(int u , int v) ;void func1(int u , int v) ;

void func2(int *pu , int *pv) ;void func2(int *pu , int *pv) ;

printf)“Before calling func1: u=%d ,v=%d” ,u,v(;printf)“Before calling func1: u=%d ,v=%d” ,u,v(; func1)u,v( ;func1)u,v( ; printf)printf)““After calling func1:u=%d,v=%dAfter calling func1:u=%d,v=%d””,u,v(;,u,v(; printf)printf)““Before calling func2:u=%d,v=%dBefore calling func2:u=%d,v=%d””,u,v(;,u,v(; func2)u,v( ;func2)u,v( ; printf)printf)““After calling func2: u=%d,v=%dAfter calling func2: u=%d,v=%d””,u,v(;,u,v(; }}

Page 36: برنامه سازی پیشرفته

void func1)int u, int v(void func1)int u, int v( {{ u=0 ,v=0 ;u=0 ,v=0 ; printf)printf)““Within func1 : u=%d , v=%dWithin func1 : u=%d , v=%d”” ,u,v ( ; ,u,v ( ; return ;return ; }}

void func2) int *pu , int *pv( void func2) int *pu , int *pv(

{{

*pu=0 , *pv=0 ;*pu=0 , *pv=0 ;

printf)“Within func2 :*pu=%d,*pv=printf)“Within func2 :*pu=%d,*pv=%d”,*pu,*pv( ;%d”,*pu,*pv( ;

return ;return ;

}}

Page 37: برنامه سازی پیشرفته

توضیح :خروجی برنامه به این شکل خواهد بود توضیح :خروجی برنامه به این شکل خواهد بود

Before calling func1 : u=1 , v=3Before calling func1 : u=1 , v=3

Within func1 : u=0 , v=0Within func1 : u=0 , v=0

After calling func1 : u=1 , v=3After calling func1 : u=1 , v=3

Before calling func2 : u=1 , v=3Before calling func2 : u=1 , v=3

Within func2 : *pu=0 , *pv=0Within func2 : *pu=0 , *pv=0

After calling func2 : u=0 , v=0After calling func2 : u=0 , v=0

دومتغیر از نوع صحیح را به عنوان آرگومان می پذیرد . دومتغیر از نوع صحیح را به عنوان آرگومان می پذیرد . func1func1 تابع تابع دواشاره گر به متغیرهای صحیح را به عنوان آرگومان دواشاره گر به متغیرهای صحیح را به عنوان آرگومان func2func2تابعتابع

می پذیرد .می پذیرد .

Page 38: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته انتقال دو طرفه اطالعات : انتقال دو طرفه اطالعات :

وقتی تابعی آدرس متغیری را در برنامه وقتی تابعی آدرس متغیری را در برنامهفراخواننده آن بداند ، می تواند :فراخواننده آن بداند ، می تواند :

مقادیر آن متغیر را تغییر دهد .مقادیر آن متغیر را تغییر دهد .( ( 11

از مقدارآن متغیر استفاده کند . از مقدارآن متغیر استفاده کند .( ( 22 روش فوق محدودیتی را که در برگرداندن روش فوق محدودیتی را که در برگرداندن

نتایج تابع فرعی به کمک نام آن تابع وجود نتایج تابع فرعی به کمک نام آن تابع وجود دارد ، ) فقط می توان یک مقدار را با نام تابع دارد ، ) فقط می توان یک مقدار را با نام تابع

..برگرداند ( ازبین می برد برگرداند ( ازبین می برد

Page 39: برنامه سازی پیشرفته

دربرنامه زیرضµرایب معادلµه درجµه دومی خوانµده وسµپس دربرنامه زیرضµرایب معادلµه درجµه دومی خوانµده وسµپس 172172صµفحهصµفحه1111--88مثµالمثµال ریشµه هµای معادلµه محاسµبه می شµود و بµه تµابع ریشµه هµای معادلµه محاسµبه می شµود و بµه تµابع rootrootبافراخوانµدن تµابع فµرعی بافراخوانµدن تµابع فµرعی

اصµلی بµرمی گردانµد. اگµر ریشµه حقیقی نداشµته باشµد تµابع فµرعی هردوریشµه اصµلی بµرمی گردانµد. اگµر ریشµه حقیقی نداشµته باشµد تµابع فµرعی هردوریشµه رµا صµفµر بµرمی گرµدانµد.µ اگµر معµادلµه µریشµه µداشµته µباشµد ضµرایب معµادلµهµ همµراµه بµا رµا صµفµر بµرمی گرµدانµد.µ اگµر معµادلµه µریشµه µداشµته µباشµد ضµرایب معµادلµهµ همµراµه بµا

ریشه های آن در تابع اصلی چاپ میشود.ریشه های آن در تابع اصلی چاپ میشود.

#include<stdio.h>#include<stdio.h>

#include<math.h>#include<math.h>

main)(main)(

{{

float a,b,c,x1,x2 ;float a,b,c,x1,x2 ;

scanf)scanf)““%f %f %f%f %f %f”” , &a , &b, &c( ; , &a , &b, &c( ;

root )a,b,c, &x1, &x2( ;root )a,b,c, &x1, &x2( ; if)x1==0 && x2==0(if)x1==0 && x2==0( printf)printf)““\n %f %f %f no real solution\n %f %f %f no real solution””,a,b,c(;,a,b,c(; elseelse printf)printf)““\n %f %f %f %f %f \n %f %f %f %f %f ””,a,b,c,x1,x2( ; ,a,b,c,x1,x2( ; }}

Page 40: برنامه سازی پیشرفته

void root )a,b,c,px1,px2(void root )a,b,c,px1,px2(float a,b,c,*px1,*px2 ;float a,b,c,*px1,*px2 ; {{ float d, delta ;float d, delta ; delta=b*b - 4*a*c ;delta=b*b - 4*a*c ; if )delta<0(if )delta<0( {{ *px1=*px2=0 ;*px1=*px2=0 ; return ;return ; }} else else {{ d=sgrt)delta( ;d=sgrt)delta( ; *px1=)-b+d(/)2*a( ;*px1=)-b+d(/)2*a( ; *px2=)-b-d(/)2*a( ;*px2=)-b-d(/)2*a( ; return ;return ; }} }}

Page 41: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهاشاره گرها و آرایه ها :اشاره گرها و آرایه ها :

. نام آرایه در واقع اشاره گری به اولین عنصر آن است . نام آرایه در واقع اشاره گری به اولین عنصر آن استبه عبارت دیگر نام آرایه ، آدرس اولین عنصرآن آرایه به عبارت دیگر نام آرایه ، آدرس اولین عنصرآن آرایه

است .است . مثال اگر داشته باشیم مثال اگر داشته باشیم

char str[80] , *pchar str[80] , *p ; ; p= strp= str ; ;

از آنجا که دو دستور زیر هم ارزند ، لذا در اشاره گر از آنجا که دو دستور زیر هم ارزند ، لذا در اشاره گرpp آدرس آرایه ، یعنی اولین عنصر آرایه قرار داده شده آدرس آرایه ، یعنی اولین عنصر آرایه قرار داده شده

است .است . p=&str[0]p=&str[0] ; ; p=str p=str ;;

Page 42: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهعنصری مثل عنصری مثل nnروشهای دست یابی به عناصر یک آرایه روشهای دست یابی به عناصر یک آرایه

a[n]a[n]: :

a[k]a[k]دست یابی از طریق اندیس آرایهدست یابی از طریق اندیس آرایه( ( 11

((p+kp+k*)*) دست یابی از طریق اشاره گر دست یابی از طریق اشاره گر((22

((a+ka+k*)*)دست یابی از طریق اشاره گر دست یابی از طریق اشاره گر ( ( 33 هµوای خانµتند و محتµتورفوق هم ارزهسµه دسµه هرسµوای خانµتند و محتµتورفوق هم ارزهسµه دسµهرسkk

µ هµکµ هµام آرایµ هµکµ هµام آرای((k+1k+1))رمی امینامینµرا بµ تµاسµ هµآرایµ رµرمی عنصµرا بµ تµاسµ هµآرایµ رµعنص از µطریµق عناµصµر بµه یµابµی دسµت ولµی از µطریµق گµرداننµد عناµصµر بµه یµابµی دسµت ولµی گµرداننµد

اشاµره گµر سریµعترµ از استفادهµ از اندیس اµست .اشاµره گµر سریµعترµ از استفادهµ از اندیس اµست .

Page 43: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته مثال اگر داشته باشیم مثال اگر داشته باشیم

int a[15] , *pint a[15] , *p ; ;

p=&a[0]p=&a[0] ; ;

هم هم ((a+3a+3*)*) وو((p+3p+3*)*) و وa[3]a[3]هرسه عبارت هرسه عبارت aaارزند و چهارمین عنصر ازپانزده عنصر آرایه ارزند و چهارمین عنصر ازپانزده عنصر آرایه

را برمی گردانند.را برمی گردانند. ،تµاس آن آغµاز آدرس معµرف آرایµه نµام اسµت، چون آن آغµاز آدرس معµرف آرایµه نµام چون

(*(*a+ka+k)) آدرس آدرس kkاµه یµا امین خانµه یµامین خان ( ( k+1k+1))امینامین عنصر از آرایه مزبور را برمی گرداند. عنصر از آرایه مزبور را برمی گرداند.

Page 44: برنامه سازی پیشرفته

1400

1401

1402

1403

1404

1405

1406

1407

1408

1409

nums

nums+1

nums+2

nums+3

nums+4

nums[0] = *)nums+0(

nums[1] = *)nums+1(

nums[2] = *)nums+2(

nums[3] = *)nums+3(

nums[4] = *)nums+4(

( مقادیر ( و سها آدر گرها اشاره = nums+3جمع1400+3×2=1400+6=1406

Page 45: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته منظور از منظور از (*(*nums+knums+k)) محتوای محتوایkk خانه بعداز خانه بعداز

numsnums است که در آن بزرگی هر خانه مساوی بزرگی است که در آن بزرگی هر خانه مساوی بزرگیداده یا شئ موردنظر در آرایه برحسب بایت است .داده یا شئ موردنظر در آرایه برحسب بایت است .

در عبارت در عبارت (*(*nums+knums+k)) به عنوان به عنوان ‘‘ ’’* * اپراتورستاره اپراتورستاره یک عملگر غیر مستقیم ، محتوای خانه یا آدرس یک عملگر غیر مستقیم ، محتوای خانه یا آدرس

nums+knums+k. را در اختیار قرار می دهد . را در اختیار قرار می دهد array[index]array[index] با با (*(*array+indexarray+index)). یکسان است .یکسان است اگر اگر x[i]x[i] ، در سمت چپ یک دستور جایگذاری باشد ، در سمت چپ یک دستور جایگذاری باشد

را به کار برد .را به کار برد . ((x+ix+i*)*) می توان به جای آن می توان به جای آن

Page 46: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته لµاراتی مثµل عبµاراتی مثµعب&&x[i]x[i] ، ، xx ، ، x+ix+i تµرف آدرس اسµه معµت کµرف آدرس اسµه معµک

نمµی توانندµ µدµر سمµتµ µچپ دستµوµرµ جایگذµاµرµی بهµ µکµاµرµ µبروند.نمµی توانندµ µدµر سمµتµ µچپ دستµوµرµ جایگذµاµرµی بهµ µکµاµرµ µبروند. د ، پسµیر یابµواه تغیµور دلخµه طµد بµه نمی توانµد ، پس آدرس آرایµیر یابµواه تغیµور دلخµه طµد بµه نمی توانµآدرس آرای

مجاز نیست .مجاز نیست . همهمxx ++ ++عبارتی مثل عبارتی مثل وکµه بلµود کµوجب میشµراردادی مµه روش قµه بµف آرایµوک تعریµه بلµود کµوجب میشµراردادی مµه روش قµه بµف آرایµتعری

ثµاµبت اµز حافظµه در µآغµاز اجµرای بµرنامµه رزرµو شµود. قµبµل از ثµاµبت اµز حافظµه در µآغµاز اجµرای بµرنامµه رزرµو شµود. قµبµل از پµرµدازش µعµناصµر µارایµهµ بµه آµنµهµا µحاµفظµهµ اختصµاµص دادµهµ می پµرµدازش µعµناصµر µارایµهµ بµه آµنµهµا µحاµفظµهµ اختصµاµص دادµهµ می

شود.شود. دارµوان مقµر نمی تµاره گµورت اشµددی بصµه عµف آرایµدار در تعریµوان مقµر نمی تµاره گµورت اشµددی بصµه عµف آرایµدر تعری

اµوµلیµه تµخصµیµص دادµ. بهµتµر اسµتµ این µآرایµهµ هµا بµصµورµت µعµادی اµوµلیµه تµخصµیµص دادµ. بهµتµر اسµتµ این µآرایµهµ هµا بµصµورµت µعµادی تعریف شوند.تعریف شوند.

Page 47: برنامه سازی پیشرفته

برنامه زیر را درنظربگیرید برنامه زیر را درنظربگیرید176176 صفحه صفحه 1212--88مثالمثال

#include<stdio.h>#include<stdio.h>

main) (main) (

{{

static int x[6]={10,11,12,13,14,15} ;static int x[6]={10,11,12,13,14,15} ;

int i ;int i ;

for)i=0 ; i<6 ;++i(for)i=0 ; i<6 ;++i(

printf)printf)““\n i=%d, x[i]=%d, *)x+i(=%d, \n i=%d, x[i]=%d, *)x+i(=%d, &x[i]=%x , x+i=%x&x[i]=%x , x+i=%x””, i, x[i] , *)x+i(, &x[i], , i, x[i] , *)x+i(, &x[i], x+i( ;x+i( ;

} }

Page 48: برنامه سازی پیشرفته

در مبنای در مبنای 7272توضیح : فرض بر این است که آدرس آرایه ، توضیح : فرض بر این است که آدرس آرایه ، باشد (باشد (1616

i=0i=0x[i]=1x[i]=100

*)x+i(=10*)x+i(=10&x[i]=72&x[i]=72x+i=72x+i=72

i=1i=1x[i]=1x[i]=111

*)x+i(=11*)x+i(=11&x[i]=74&x[i]=74x+i=74x+i=74

i=2i=2x[i]=1x[i]=122

*)x+i(=12*)x+i(=12&x[i]=76&x[i]=76x+i=76x+i=76

i=3i=3x[i]=1x[i]=133

*)x+i(=13*)x+i(=13&x[i]=78&x[i]=78x+i=78x+i=78

i=4i=4x[i]=1x[i]=144

*)x+i(=14*)x+i(=14&x[i]=7a&x[i]=7ax+i=7ax+i=7a

i=5i=5x[i]=1x[i]=155

*)x+i(=15*)x+i(=15&x[i]=7c&x[i]=7cx+i=7cx+i=7c

خروجی برنامه

Page 49: برنامه سازی پیشرفته

178178 صفحه صفحه 1313--88مثال مثال

از مقµادیر صµحیح می تµوان از مقµادیر صµحیح می تµوان aa عنصµری عنصµری 1010برای تعریµف آرایµه برای تعریµف آرایµه aa نوشµت ، یعµنی نوشµت ، یعµنی int *aint *a بµه صµورت بµه صµورت ; ;int a[10]int a[10]بµه جµای بµه جµای

را متغیر اشاره گر تعریف کرد .را متغیر اشاره گر تعریف کرد .

یµک بلµوک از حافظµه اختصµاص نمی یابµد یµک بلµوک از حافظµه اختصµاص نمی یابµد aa در روش دوم بµه در روش دوم بµه بلکه بصورت متغیر اشاره گر تعریف شده است .بلکه بصورت متغیر اشاره گر تعریف شده است .

بµه نیµاز اختصµاص حافظµه مµورد بµه برای نیµاز اختصµاص حافظµه مµورد آرایµه aaبرای آرایµه جهت معµرفی جهت معµرفی تµابع 1010ایای از تµوان تµابع عنصµری ، می از تµوان بصµورت زیµر بصµورت زیµر mallocmalloc عنصµری ، می

استفاده کرد استفاده کرد

a=a= malloc )10*sizeof)int(( ;malloc )10*sizeof)int(( ;

مقµدار مقµدار 1010 این تµابع بلµوک حافظµه ای بµرای ذخµیره کµردن این تµابع بلµوک حافظµه ای بµرای ذخµیره کµردن اپراتµور کنµد. می رزرو اپراتµور صµحیح کنµد. می رزرو داده sizeofsizeof صµحیح نµوع داده بµزرگی نµوع بµزرگی

را برحسµب بµایت بµرمی گردانµدو این مقµدار را برحسµب بµایت بµرمی گردانµدو این مقµدار intint برحسµب برحسµب )تعµداد عناصµر آرایµه (ضµرب میشµود تµا فضµای مµورد )تعµداد عناصµر آرایµه (ضµرب میشµود تµا فضµای مµورد 1010در در

نیاز برحسب بایت تعیین و رزروشود.نیاز برحسب بایت تعیین و رزروشود.

Page 50: برنامه سازی پیشرفته

از لحاظ اطمینان کامل می توان از تبدیل نوع از لحاظ اطمینان کامل می توان از تبدیل نوعcastcast استفاده کرد و آن را بصورت زیر به کار استفاده کرد و آن را بصورت زیر به کاربرد برد

a=)int*(malloc)10*sizeof)int(( ;a=)int*(malloc)10*sizeof)int(( ;

روش اختصاص روش اختصاص این گونه اختصاص حافظه به این گونه اختصاص حافظه به موسوم است . موسوم است .حافظه پویاحافظه پویا

اگر قرار باشد به عناصر آرایه ، مقدار اولیه اگر قرار باشد به عناصر آرایه ، مقدار اولیه به جای متغیر اشاره گر به جای متغیر اشاره گر aaاختصاص یابد ، بایداختصاص یابد ، باید

بصورت آرایه توصیف شود مانند زیر بصورت آرایه توصیف شود مانند زیر

int a[10]={1,2,3,4,5,6,7,8,9,10} ;int a[10]={1,2,3,4,5,6,7,8,9,10} ;

یا یا

int a[ ]={1,2,3,4,5,6,7,8,9,10}int a[ ]={1,2,3,4,5,6,7,8,9,10}

Page 51: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته ، ودµیف شµر توصµاره گµیر اشµب متغµه برحسµر آرایµود ، اگµیف شµر توصµاره گµیر اشµب متغµه برحسµر آرایµاگ

رµزروکµردن جµاµ اتفµاµق نمیµ افتدودرنتیجµه موقµعµ اسµتفاده رµزروکµردن جµاµ اتفµاµق نمیµ افتدودرنتیجµه موقµعµ اسµتفاده ازµ µاشµارµه گµر بµرای آµرایµه µبایµد قµبµل ازµ پµردµاµزش عµناصµر ازµ µاشµارµه گµر بµرای آµرایµه µبایµد قµبµل ازµ پµردµاµزش عµناصµر

آµن µ، به عنµاصرµ آرایهµ حاµفظهµ اخµتصاµص دµادهµ شوµد.آµن µ، به عنµاصرµ آرایهµ حاµفظهµ اخµتصاµص دµادهµ شوµد. تفاده ازµا اسµه ، بµه حافظµاص اولیµالت کلی اختصµتفاده از درحµا اسµه ، بµه حافظµاص اولیµالت کلی اختصµدرح

انجام می شود.انجام می شود.mallocmalloc تاµبع کتابخانµه ای تاµبع کتابخانµه ای ود، نمیµف شµر تعریµاره گµیر اشµورت متغµه بصµر آرایµود، نمی اگµف شµر تعریµاره گµیر اشµورت متغµه بصµر آرایµاگ

تµوان µبµه عنµاصµرآراµیه هµای عµددی µمقµدار µاولیµه نسµبت تµوان µبµه عنµاصµرآراµیه هµای عµددی µمقµدار µاولیµه نسµبت داµد µو درµ این مµوارد µتعریµف µآراµیµه بایµد بصµوµرµت عµادی یµا داµد µو درµ این مµوارد µتعریµف µآراµیµه بایµد بصµوµرµت عµادی یµا

قراردادی انجام شود.قراردادی انجام شود.

Page 52: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهاشاره گرها و آرایه های چند بعدی:اشاره گرها و آرایه های چند بعدی:

دیµای دوبعµه هµیر آرایµدی را هم نظµای چندبعµه هµدی آرایµای دوبعµه هµیر آرایµدی را هم نظµای چندبعµه هµآرایمی تµوان برحµسµب اشµارهµ گµر)µنµام آµرایµه( و مقµدار می تµوان برحµسµب اشµارهµ گµر)µنµام آµرایµه( و مقµدار

µتµسµآفµ نµواµنµع µهµبµتµسµآفµ نµواµنµع µهµب((offsetoffset)) µنµردµک جµبµراµن بµراµی µنµردµک جµبµراµن بµراµی مµقدار اµندیس عµنصر مورµد نµظر نماµیش دµاد .مµقدار اµندیس عµنصر مورµد نµظر نماµیش دµاد .

هµام آرایµه مثال اگرنµام آرایµمثال اگرنaa رµر وعنصµوعنصa[5]a[5] ، دµد ، موردنظرباشµموردنظرباش بµه µآن ارجµاعµ کµردµ کµه بµه µآن ارجµاعµ کµردµ کµه ((a+5a+5*)*)می تµواµ ن بصµورµت می تµواµ ن بصµورµت

µ انµن همµت آµآفس µدارµقµمµ انµن همµت آµآفس µدارµقµه 55مµآرایµ امµه نµه بµت کµه اسµآرایµ امµه نµه بµت کµاس بµه آن بµه آن ’’* µ *µ ‘‘اضµافµه شµدµه اسµتµ و بµهµ کمµک µعملگµر اضµافµه شµدµه اسµتµ و بµهµ کمµک µعملگµر

دسترسی می یابیم .دسترسی می یابیم .

Page 53: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته کµای یµه هµه ای از آرایµدی مجموعµای دوبعµه هµک آرایµای یµه هµه ای از آرایµدی مجموعµای دوبعµه هµآرای

بعدی است .بعدی است . هµر بµاره گµورت اشµدی را بصµه دوبعµوان آرایµه می تµر بµاره گµورت اشµدی را بصµه دوبعµوان آرایµمی ت

گµروه پیوسµته و مجµاورهم ازآرایµه هµای یµک بعµدی گµروه پیوسµته و مجµاورهم ازآرایµه هµای یµک بعµدی تعریف کرد .تعریف کرد .

می توان توصیف آرایه ای دو بعدی را بجای می توان توصیف آرایه ای دو بعدی را بجای

data-typedata-type arrayarray [d1][d2][d1][d2] ; ;

بصورت زیر نوشت :بصورت زیر نوشت :

data-typedata-type )*ptvr()*ptvr([d2][d2] ; ;

Page 54: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهدر حالت کلی می توان به جایدر حالت کلی می توان به جای

data-typedata-type arrayarray [d1][d2][d1][d2]…………[dn][dn] ; ;نوشت :نوشت :

data-typedata-type )*ptvr( [d2][d3])*ptvr( [d2][d3]…….[dn].[dn]

نوع عناصر آرایه است. نوع عناصر آرایه است.data-typedata-typeکه در آن که در آن arrayarray .نام آرایه است.نام آرایه است

به ترتیب ماکزیمم عناصر به ترتیب ماکزیمم عناصر ]]d1d1][][d2d2[[…………]]dndn[[عناصر عناصر هر اندیس یا هر بعد آرایه است .هر اندیس یا هر بعد آرایه است .

PtvrPtvr . نام متغیر اشاره گر است . نام متغیر اشاره گر است

Page 55: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهانتقال آرایه به تابع :انتقال آرایه به تابع :

نام آرایه ای که به عنوان آرگومان تابع به کار می رود نام آرایه ای که به عنوان آرگومان تابع به کار می رودآدرس اولین عنصر آرایه تفسیر می شود.آدرس اولین عنصر آرایه تفسیر می شود.

main) (main) ( {{ float func) ( ;float func) ( ; float x , array[15] ;float x , array[15] ; ………… …….... x=func)array( ; /* same as func)&array[0]( */x=func)array( ; /* same as func)&array[0]( */ ……..…….... }}

Page 56: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته

در تابع فرعی باید آرگومان را به عنوان اشاره گر به در تابع فرعی باید آرگومان را به عنوان اشاره گر بهاولین عنصر آرایه توصیف می کنیم که برای این منظور اولین عنصر آرایه توصیف می کنیم که برای این منظور

دو راه وجود دارد :دو راه وجود دارد :

func)ar(

float *ar ;

{

.….

….

}

func)ar(

float ar[ ] ;

{

….

…..

}

راه اول راه دوم

Page 57: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته ، روش اول ، روش اولarar را آرایه ای با اندازه نامشخص توصیف می را آرایه ای با اندازه نامشخص توصیف می

کند.کند. آنچه منتقل میشود اشاره گری به اولین عنصر از آرایه آنچه منتقل میشود اشاره گری به اولین عنصر از آرایه

است .است . کامپایلر می داند عبارت آرایه حاصل، به اشاره گر به اولین کامپایلر می داند عبارت آرایه حاصل، به اشاره گر به اولین

در در arar را مشابه توصیف را مشابه توصیف ararعنصر آرایه برمی گردد، پس عنصر آرایه برمی گردد، پس تبدیل می کند. تبدیل می کند.floatfloatروش دوم ، به اشاره گر از نوع روش دوم ، به اشاره گر از نوع

آنچه باید منتقل شود آدرس پایه یا آدرس اولین عنصر آرایه آنچه باید منتقل شود آدرس پایه یا آدرس اولین عنصر آرایهاست است

در روش دوم راهی وجود ندارد تا بتوان تشخیص داد آیا در روش دوم راهی وجود ندارد تا بتوان تشخیص داد آیاarar یا تنها به یک عنصر از نوع یا تنها به یک عنصر از نوع floatfloatبه آغاز آرایه ای از نوع به آغاز آرایه ای از نوع

floatfloat . اشاره می کند یا نه .اشاره می کند یا نه

Page 58: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهآرایه هایی از اشاره گرها:آرایه هایی از اشاره گرها:

آرایµه هµایی هسµتند کµه عناصµر آن اشµاره گµر باشµند. در واقµع آرایµه هµایی هسµتند کµه عناصµر آن اشµاره گµر باشµند. در واقµع اشµاµره گµرهµایی هµسµتند کµه می µتواننµد آدرµس متغیرهµایی اشµاµره گµرهµایی هµسµتند کµه می µتواننµد آدرµس متغیرهµایی

از نوعµ مقادیر µصحیح µرا در µخود داشته بµاشند.از نوعµ مقادیر µصحیح µرا در µخود داشته بµاشند. int *x[10]int *x[10]; ;

بµه عنصµر بµه عنصµر zz مثµال: بµرای اختصµاص آدرس متغµیری بµه نµام مثµال: بµرای اختصµاص آدرس متغµیری بµه نµام می نویسیم: می نویسیم:xx عنصری عنصری 1010سوم آرایه سوم آرایه

*x[2]=&z ;*x[2]=&z ;استفاده استفاده ]]xx**[**[ از دستور از دستور zz برای بدست آوردن مقدار برای بدست آوردن مقدار

میشود.میشود.

Page 59: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته ایµه آرایµه مثµل هم را گرهµا اشµاره از ای هµای آرایµه آرایµه مثµل هم را گرهµا اشµاره از ای آرایµه

معمµولی می تµوان بµا قµرار دادن نµام آرایµه بµدون معمµولی می تµوان بµا قµرار دادن نµام آرایµه بµدون تµابع یµک بµه تµابع آرگومµان عنµوان بµه آن تµابع انµدیس یµک بµه تµابع آرگومµان عنµوان بµه آن انµدیس

انتقال داد. انتقال داد. ارهµداری اشµرای نگهµر اغلب بµاره گµای اشµه هµاره آرایµداری اشµرای نگهµر اغلب بµاره گµای اشµه هµآرای

گرهایی به رشته ها به کار می روند .گرهایی به رشته ها به کار می روند .

Page 60: برنامه سازی پیشرفته

را را xxمی تواند آرایه می تواند آرایه FF1FF1 تابع تابع 182182 صفحه صفحه 1515--88مثال مثال بصورت زیر دریافت کند .بصورت زیر دریافت کند .

void FF1)int *a[ ]( void FF1)int *a[ ](

{ {

int k ;int k ;

for)k=0 ; k<10 ; k++ (for)k=0 ; k<10 ; k++ (

printf)printf)““ %p %p”” , *a[k]( ; , *a[k]( ;

} }

اشاره گری به مقادیر صحیح نیست بلکه اشاره گری به مقادیر صحیح نیست بلکه aaتوضیح : در این مثال توضیح : در این مثال اشاره گری به آرایه ای از اشاره گرهایی به مقادیر صحیح است اشاره گری به آرایه ای از اشاره گرهایی به مقادیر صحیح است

آرایه ای از اشاره گرهایی به آرایه ای از اشاره گرهایی به aaبنابراین نیاز است که پارامتر بنابراین نیاز است که پارامتر مقادیر صحیح ، به همان طریق که نشان دادیم توصیف شود .مقادیر صحیح ، به همان طریق که نشان دادیم توصیف شود .

Page 61: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهاشاره گر به اشاره گر:اشاره گر به اشاره گر:

اگر متغیری که آدرسش در متغیر دیگری نگه می اگر متغیری که آدرسش در متغیر دیگری نگه میشود خود اشاره گر باشد ، متغیر اول را اشاره گر شود خود اشاره گر باشد ، متغیر اول را اشاره گر

به اشاره گر نامند.به اشاره گر نامند. مقدار اشاره گر معمولی، آدرس متغیر است اما مقدار اشاره گر معمولی، آدرس متغیر است اما

در مورد اشاره گر به اشاره گر، اولین اشاره گر در مورد اشاره گر به اشاره گر، اولین اشاره گر آدرس اشاره گر دوم را دارد که آن هم به نوبه آدرس اشاره گر دوم را دارد که آن هم به نوبه

خودآدرس متغیر دیگری را در خود دارد .خودآدرس متغیر دیگری را در خود دارد . برای توصیف متغیرهایی از نوع اشاره گر به برای توصیف متغیرهایی از نوع اشاره گر به

قبل از آن قرارداد. قبل از آن قرارداد.’’ ** ** ’’اشاره گر باید دو ستارهاشاره گر باید دو ستاره

Page 62: برنامه سازی پیشرفته

آدرس متغیَر مقدار متغیَر

آدرس اشاره گَر دوم آدرس متغیَر مقدار متغیر½

اشاره گَر اول

اشاره گَر اول

اشاره گَر دوم

Page 63: برنامه سازی پیشرفته

184184مثال صفحه مثال صفحه

#include<stdio.h>#include<stdio.h>

main) (main) (

{{

int x, *p ,**q ;int x, *p ,**q ;

x=10 ;x=10 ;

p=&x ;p=&x ;

q=&p ;q=&p ;

printf)printf)““%d%d””,**q( ; ,**q( ; /* print the value of x *//* print the value of x */

}}

Page 64: برنامه سازی پیشرفته

توضیح :توضیح :

هم هم qqو و intint اشاره گر به متغیر اشاره گر به متغیر pp در این مثال در این مثال اشاره گری به اشاره گر توصیف شده است اشاره گری به اشاره گر توصیف شده است

که ممکن است آدرس متغیری از نوع که ممکن است آدرس متغیری از نوع intint. راداشته باشد .راداشته باشد

1010این خواهد شد که این خواهد شد که printfprintf نتیجه اجرای نتیجه اجرای ( روی صفحه نمایش نشان ( روی صفحه نمایش نشان xx)مقدار متغیر )مقدار متغیر

داده شود .داده شود .

Page 65: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفتهارسال تابعی به تابع دیگر:ارسال تابعی به تابع دیگر:

را آن اعالن می شµود دیگµر تµابع درون تµابعی را وقµتی آن اعالن می شµود دیگµر تµابع درون تµابعی وقµتی تبدیل اشاره گری به خودش می نامند .تبدیل اشاره گری به خودش می نامند .

رµدیگ توابµع بµه تµوان می را گرهµا اشµاره قبیµل دیگµر این توابµع بµه تµوان می را گرهµا اشµاره قبیµل این فµرسµتµاد کµه بµاعث µمیشµود تµابع مµتنµاظرµ بµاµ آنµهµا بµه تµابع فµرسµتµاد کµه بµاعث µمیشµود تµابع مµتنµاظرµ بµاµ آنµهµا بµه تµابع دسµت آن بµه بتµوان آنهµا درون و ارسµال شµود دسµت دیگµر آن بµه بتµوان آنهµا درون و ارسµال شµود دیگµر

یافت.یافت. وارهµهم تµابع اسµتفاده مµورد حقیقی آرگومµان همµواره چون تµابع اسµتفاده مµورد حقیقی آرگومµان چون

تغیµیرµ می کنµد ، در فراµخوانیهµاµی مµختلµف تµابع دوµم می تغیµیرµ می کنµد ، در فراµخوانیهµاµی مµختلµف تµابع دوµم می توان اشاره گرهای گوناگونی به آن فرستاد .توان اشاره گرهای گوناگونی به آن فرستاد .

رµابعی دیگµود تµان محلی خµق آرگومµابعی از طریµر تµر اگµابعی دیگµود تµان محلی خµق آرگومµابعی از طریµر تµاگراµ بپµذیرد µبایµد دراعالن آنµ مشµخµص شµودکه آرµگومµان راµ بپµذیرد µبایµد دراعالن آنµ مشµخµص شµودکه آرµگومµان

محلی مورد نظر اشاره گری است به تابع .محلی مورد نظر اشاره گری است به تابع .

Page 66: برنامه سازی پیشرفته

برنامه سازی پیشرفتهبرنامه سازی پیشرفته درساده ترین شکل این آرگومان را می توان درساده ترین شکل این آرگومان را می توان

بصورت زیر اعالن کرد :بصورت زیر اعالن کرد :

data-type )*function-name( ) ( ;data-type )*function-name( ) ( ;

نوع داده کمیت بازگشتی تابع نوع داده کمیت بازگشتی تابع data-typedata-type که که ارسالی است .ارسالی است .

بدنبال این اعالن می توان با عملگر بدنبال این اعالن می توان با عملگرغیرمستقیم به تابع مزبوردست یافت .غیرمستقیم به تابع مزبوردست یافت .