ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

جلسة هشتم ونهم اشاره‌گر ( Pointer ) ساختمان در زبان C

<!-- /* Font Definitions */ @font-face {font-family:Mitra; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:396171410; mso-list-type:hybrid; mso-list-template-ids:-1944968990 -705007658 -657978352 48513554 419851508 1863329148 -1969483610 812695914 -1500339184 2130839800;} @list l0:level1 {mso-level-number-format:bullet; mso-level-text:•; mso-level-tab-stop:36.0pt; mso-level-number-position:left; text-indent:-18.0pt; font-family:"Times New Roman";} @list l1 {mso-list-id:1146776890; mso-list-type:hybrid; mso-list-template-ids:1379302224 818556196 244470744 -240777132 -1100081460 -478377994 2104389648 -1441356012 741622698 483833882;} @list l1:level1 {mso-level-number-format:bullet; mso-level-text:•; mso-level-tab-stop:36.0pt; mso-level-number-position:left; text-indent:-18.0pt; font-family:"Times New Roman";} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

mo-mah.perssianblog.ir

mohsen_mahyar@yahoo.com

 

C اشاره‌گر در زبان ( Pointer ) ونهم جلسة هشتم

 

 

اشاره‌گر ( Pointer )

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

 

 

C لزوم استفاده از اشاره‌گرها در

         درک و استفادة بهتر از آرایه‌ها و رشته‌ها

         استفاده از پارامترهای Call by reference در توابع

         تخصیص حافظة پویا

         ایجاد و کار با ساختمانهای داده‌ای پیچیده

 

نحوة تعریف متغیر اشاره‌گر

نام متغیر اشاره‌گر *                  نوع داده‌ای که به آن اشاره می‌کند

 

int        * p ;

char        * pc ; عملگرهای اشاره‌گر

& : آدرس عملوند خود را مشخص می‌کند.

عملوند آن نام یک متغیر است.                              & i

 

* : محتوای عملوند خود را مشخص می‌کند.

عملوند آن نام یک متغیر اشاره‌گر است.        * p

 

 

float    * fp ;

 

مثال

int  i = 100 ;

int  * pi ;

 

 

 

pi = & i ;

* pi = 450 ;

 
mohsen_mahyar@yahoo.com

mo-mah.perssianblog.ir

 

 

 

عملگرهای مجاز دیگر

         انتساب اشاره‌گرها به یکدیگر

         جمع و تفریق با یک ثابت یا عبارت محاسباتی

         عملگرهای رابطه‌ای

 

مثال

int  * p1 , * p2 , i ;

p1 = p2 ;

p1 = p1 + 2 ;

p1 = p1 + i * 2 ;

p1 == p2

p2 <= p1

 

اشاره‌گرها و توابع

پارامتر Call by reference پارامتری است که تغییرات آن در داخل تابع عینا به فراخوانندة آن منعکس می‌شود.

 

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

 

مثال برنامه‌نویسی

 

تابعی که محتوای دو متغیر را با یکدیگر عوض می‌کند.

 

 

روش غلط

void  swap (int  a , int  b)

{

            int  temp ;

            temp = a ;

            a = b ;

            b = temp ;

}

 

 

روش صحیح

void  swap (int  *a , int  *b)

{

            int  temp ;

            temp = *a ;

            *a = *b ;

            *b = temp ;

}

 

 

void  main ()

{

            int x = 10 , y = 20 ;

            swap ( &x , &y ) ;

            printf (“x = %d , y = %d” , x , y) ;

}

خروجی:

x = 20 , y = 10

 

 

 

اشاره‌گر و آرایه

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

int A [5] ;

A + 2

 

بنابراین

A [2]

معادل

* (A + 2)

 

A [2] = 100 ;

* (A + 2) = 100 ; رشته و اشاره‌گر

رشته نیز یک آرایه است

و بنابراین

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

 

scanf (“%s” , s) ;

 

 

آرایه و رشته بعنوان پارامتر تابع

void  f (int  *a ; char *s) {

            ...

            a [2] = 100 ;

            strcpy (s , “Ali”) ;

}

 

void  main () {

            int  b [10] ;

            char  str [20] ;

            ...

            f (b , str) ;

}

تخصیص حافظة پویا

؟

نیاز به حافظه‌ای که مقدار آن موقع نوشتن برنامه مشخص نیست بلکه در زمان اجرا مشخص می‌شود.

تابع تخصیص حافظة پویا

 

void  * malloc (اندازة حافظة مورد نیاز به بایت)

 

int  *p ;

p = (int *) malloc ( sizeof (int) ) ;

 

تعریف یک آرایه بصورت پویا

 

int  *A ;

A = (int *) malloc ( sizeof (int) * 100 ) ;

 

با دستورات فوق آرایه‌ای با ظرفیت 100 عنصر با نام A و بصورت پویا ایجاد می‌شود.

 

تابع آزادسازی حافظة پویا

free (اشاره‌گری که قبلا به آن حافظه اختصاص داده شده)

 

int  *A ;

A = (int *) malloc ( sizeof (int) * 100 ) ;

کار با حافظة پویا...  //

free (A) ; مثال

برنامه‌ای که نمرة تعدادی دانشجو را دریافت کرده و ...

 

تعداد دانشجویان ؟

 

روش غلط

int  n ;

float  A [n] ;

...

scanf (“%d” , &n) ;

 

روش صحیح

int  n ;

float  *A ;

...

scanf (“%d” , &n) ;

A = (float *) malloc (sizeof (float) * n) ;

کار با آرایةA  ...  //

free (A) ;

 

 

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.perssianblog.ir

 

 

جلسة نهم ساختمان ( Structure )

 

برای نگهداری اطلاعات

از انواع داده‌ای مختلف (بر خلاف آرایه)

مرتبط با یکدیگر

تحت یک نام

struct  نام نوع ساختمان

{

             نام فیلد 1   نوع فیلد 1;

            ...

; نام فیلد n    نوع فیلد n   

}  اسامی متغیرهای از نوع ساختمان;

 

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

 

 

مثال:  ساختمانی برای نگهداری اطلاعات دانشجو

struct  student {

            int  student_no ;

            char  fname [20] ;

            char  lname [10] ;

            float  average ; دستیابی به فیلدهای ساختمان

نام فیلد . نام متغیر از نوع ساختمان

stud1.average = 17.3 ;

scanf (“%d” , &stud1. student_no) ;

strcpy (stud1.lname , “Rezaie”) ;

 

 

} ;

struct  student stud1 , stud2 ;

 

 

 

 

 

 

 

نکته

انتساب ساختمانهای همنوع به یکدیگر امکان‌پذیر است که با این عمل تک‌تک فیلدها منتقل خواهد شد.

struct  student  stud1 , stud2 ;

...

 

 

stud1 = stud2 ; آرایه‌ای از ساختمانها

مثال: آرایه‌ای برای نگهداری اطلاعات دانشجویان یک کلاس

struct  student  A [100] ;

A [15].average = 12.25 ;

strcpy (str1 , A [2].fname) ;

 

 

 

ساختمان و اشاره‌گر

دسترسی به فیلدها توسط اشاره‌گر به ساختمان

نام فیلد - > نام اشاره‌گر به ساختمان

struct  student  *p ;

p = &stud1 ;

p - > average = 14.5 ;

 

مثال برنامه‌نویسی: جابجایی محتوای دو رکورد

void  swap ( struct student *s1 ,

                                       struct student *s2) {

            struct student temp ;

            temp = *s1 ;

            *s1 = *s2 ;

            *s2 = temp ;

}

 

 

union

محلی از حافظه است که توسط دو یا چند متغیر بطور مشترک استفاده می‌شود

البته

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

 

تعریف union

union  نام نوع یونیون

{

             نام فیلد 1   نوع فیلد 1;

            ...

; نام فیلد n    نوع فیلد n   

}  اسامی متغیرهای از نوع یونیون;

 

مثال

union  u

{

            int i ;

            char ch ;

            float f ;

} u1 ;

 

 

حافظه‌ای که در نظر گرفته می‌شود

به اندازة طول عنصری است که

بیشترین طول را دارد.

ا

 

 

 

mohsen_mahyar@yahoo.com

mo-mah.perssianblog.ir

 

   + MOHSEN GHASEMI - ۱:۳٤ ‎ب.ظ ; ۱۳۸٩/٦/٥