تبليغاتX
.:: لوتوس دنیای موبایل ::.
.:: لوتوس دنیای موبایل ::.
دانلود برنامه موبایل - ترفندهای موبایل - دانلود نرم افزار کامپیوتر)نظر یادتون نره(
قال رسول الله (ص) : ايها الناس ! انه قد اقبل اليكم شهر الله بالبركة و الرحمة و المغفرة
ارزش دهي اوليه رشته ها به عنوان اشاره گر

دسته بندی : / لینک ثابت

در اين قسمت مي خواهيم مشخص كنيم كه چگونه ميتوان رشته ها را بعنوان اشاره گر
مقدار اوليه داد . براي روشن شدن موضوع ، به مثال 1 توجه نماييد .

مثال 1: main)(
{
char *text="your name is:";
char name[41] ;
printf("\n enter your name: " );
gets(name );
printf("\n\n %s text" );
puts(name );
}

نمونه اي از خروجي برنامه مثال 1 : enter your name:mohammad
your name is:mohammad

اولين دستور مثال 1 را بصورت زير نيز مي توان نوشت : static char text[] = "your name is:";

اين دو دستور از نظر اثري كه در حافظه مي گذارند تفاوتي با يكديگر ندارند .
ولي چون دستوري كه در برنامه آمده است متغير text را بصورت اشاره گر تعريف كرده
است ، قابليت انعطاف بيشتري به اين متغير داده است . اين امر باعث شده است كه
با دستور ساده ;(text++)puts رشته text كاراكتر به كاراكتر به خروجي منتقل گردد
كه نتيجه زير حاصل خواهد شد : your name is:

وقتي كه رشته ها به صورت اشاره گر تعريف مي شوند ، بخصوص در مواقعي كه طول
عناصر مختلف آن ، متفاوت باشند موجب صرفه جويي در ميزان حافظه مي گردند ( مثال ( . 2


مثال 2: برنامه اي كه براي ذخيره كردن نام هاي تعدادي از افراد ، از آرايه اي
از اشاره گرها استفاده مي كند. اين برنامه با خواندن نام 5 نفر از ورودي ، آنها
را در آرايه اي قرار داده ، سپس نامي را از ورودي دريافت مي كند و تشخيص مي دهد
كه آيا اين نام در ليست وجود دارد يا خير . main)(
{
int dex / exist=0 /k ;
char name[21] ;
static char *list[5]=
{"ali"/
"ahmad"/
"alireza"/
"jalal"/
"mohammad"
} ;
printf("enter a name for search:");
gets(name);
for(dex=0;dex<5;dex++)
{
if(strcmp(list[dex]/name)==0)
{
exist=1 ;
break ;
}
}
if(exist==1)
printf("\n name <%s> exist."/name);
else
printf("\n name " );
printf("<%s> not exist."/name);
}

نمونه اي از خروجي برنامه مثال 2 : enter a name for search: ali
name exist.

اگر در مثال 2 فرض شود كه اولين عنصر آرايه list ( كه حاوي 5 نام است ) در
محل 1000 حافظه قرار داشته باشد . اين آرايه بصورتي كه در شكل (1) آمده است در
حافظه قرار مي گيرد .
اگر درمثال 2 بجاي تعريف آرايه اي از اشاره گرها، آرايه اي از رشته ها را تعريف
ميكرديم آنگاه مي بايست آرايه list بصورت آرايه اي دو بعدي تعريف ميشد كه تعداد
سطرهاي آن برابر با تعداد افراد ( تعداد عناصر آرايه ) و تعداد ستون هاي آن
برابر با طول طولاني ترين نام موجود بود ( شكل 2 و مثال 3 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ |A |h |m |a |d |\0|
1000ؤؤ > | 1000 List [0]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ |A |l |i |\0|
1006ؤؤ > | 1006 List [1]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ |A |m |i |n |\0|
1010ؤؤ > | 1010 List [2]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ |y |a |f |a |r |n |e |z |h |a |d |\0|
1015ؤؤ > | 1015 List [3]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ |B |a |h |r |a |m |i |\0|
1027ؤؤ > | 1027 List [4]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ
شكل (1) . نحوه قرار گرفتن آرايه اي از اشاره گرها در حافظه ، شامل 5 نام


ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | | |
|
|A hh |m |a |d |\0| 1000ؤؤؤؤؤؤؤؤؤ > List [0]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | | | | |
|
|A ll |i |\0| 1012ؤؤؤؤؤؤؤؤؤ > List [1]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | | | |
|
|A mm |i |n |\0| 1023ؤؤؤؤؤؤؤؤؤ > List [2]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |y aa |f |a |r |n |e |z |h |a |d |\0|
1035ؤؤؤؤؤؤؤؤؤ > List [3]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | |
|
|B aa |h |r |a |m |i |\0| 1047ؤؤؤؤؤؤؤؤؤ > List [4]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (2) . نحوه قرار گرفتن آرايه اي از رشته ها در حافظه ، شامل 5 نام

با توجه به نحوه ذخيره شدن اطلاعات در اشكال 1و 2و ذخيره كردن رشته ها بصورت
آرايه اي از اشاره گرها در صرفه جويي ميزان حافظه بسيار موثر است ولي در همه حالات
اينطور نيست . بعنوان مثال اگر طول همه رشته ها 12 باشد ( به اندازه بزرگترين
طول رشته در مثال 2 )، حافظه تخصيص يافته در روش اول ( آرايه اي از اشاره گرها )
داراي 5 اشاره گر اضافي خواهدبود كه حافظه بيشتري را نسبت به روش دوم ( آرايه اي
از رشته ها ) اشغال مي كند . مزيت عمده بيان رشته ها بصورت آرايه اي از اشاره گرها
سرعت بالاتر و سهولت دسترسي به عناصر آنها است . زيرا نيازي به انجام محاسبات
جهت دسترسي به عناصر آرايه نيست .

مثال 3: برنامه اي كه نام تعدادي از افراد را از ورودي خوانده و در يك آرايه
قرار مي دهد . سپس با استفاده از آرايه اي از اشاره گرها ، آن را مرتب مي كند و
نتيجه را به خروجي مي برد . main)(
{
char name[30][81] ;
char *ptr[30]/*temp ;
const int k=30 ;
int in / out / count=0 ;
while(count {
printf("\n enter name of number");
printf(" %d:"/count+1 );
gets(name[count] );
if(strlen(name[count])==0)
break ;
ptr[count++]=name[count] ;
}
for(out=0 ; out for(in=out+1 ; in if(strcmp(ptr[out]/ptr[in])>0)
{
temp=ptr[in] ;
ptr[in]=ptr[out] ;
ptr[out]=temp ;
}
printf("<< the sorted list is:>>");
for(out=0 ; out printf("\n name %d is:"/out+1);
printf("%s"/ptr[out]);
}

نمونه اي از خروجي برنامه مثال 3 : enter name of number 1:bahrami
enter name of number 2:amin
enter name of number 3:jafar
enter name of number 4:sadeghi
enter name of number 5:
<< the sorted list is:>>

name 1 is:amin
name 1 is:bahrami
name 1 is:jafar
name 1 is:sadeghi

براي توضيح بيشتر در مورد چگونگي مرتب كردن رشته ها از طريق آرايه اي از
اشاره گرها ، به شكل هاي 3و 4و كه بيانگر نحوه قرار گرفتن عناصر آرايه در حافظه
قبل و بعد از مرتب شدن هستند توجه نماييد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |B |a |h |r |a |m |i |\0|
ؤؤؤؤؤؤؤؤؤ > | ptr[0]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ | |
|
|A |m |i |n |\0|ؤؤؤؤؤؤؤؤؤ > | ptr[1]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |
|
|y |a |f |a |r |\0|ؤؤؤؤؤؤؤؤؤ > | ptr[2]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |s |a |d |e |g |h |i |\0|
ؤؤؤؤؤؤؤؤؤ > | ptr[3]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (3) . وضعيت اشاره گرها قبل از مرتب شدن


ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |B |a |h |r |a |m |i |\0|
ؤؤؤ ؤؤؤؤؤ > | ptr[0]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |
| | |A |m |i |n |\0|ؤؤؤؤؤؤؤؤؤ > | ptr[1]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |
| |y |a |f |a |r |\0|ؤؤؤؤؤؤؤؤؤ > | ptr[2]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |s |a |d |e |g |h |i |\0|
ؤؤؤؤؤؤؤؤؤ > | ptr[3]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (4) . وضعيت اشاره گرها بعد از مرتب شدن

نكته اي كه در مورد مثال 3 بايد مورد توجه قرار گيرد اين است كه آرايه name
بصورت دو بعدي تعريف شده است ولي در حين دسترسي به عناصر آن ، بصورت يك بعدي
مورد استفاده قرار گرفته است . اين مساله بدين دليل است كه در زبان C قسمتي از
آرايه را مي توان بصورت يك آرايه فرض كرد . بعبارت ديگر ، در يك آرايه دو بعدي
هر سطر را مي توان بصورت يك آرايه يك بعدي در نظر گرفت . لذا مي توان گفت كه
آرايه دو بعدي ، آرايه اي از آرايه هاي يك بعدي است . بعنوان مثال در دستور : static char name[30][81];

آرايه name يك آرايه دو بعدي تعريف شده است كه ميتوان آن را بصورت يك آرايه
يك بعدي با تعداد 30 عنصر در نظر گرفت كه هر عنصر آن نيز يك آرايه يك بعدي به


نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 14 تیر1384   10:48 \

اشاره گر و آرايه

دسته بندی : / لینک ثابت

در زبان C بين آرايه ها و اشاره گرها ارتباط نزديكي وجود دارد ( اشاره گرها
حاوي يك آدرس و اسم آرايه نيز يك آدرس است ). اسم آرايه آدرس اوليه عنصر آرايه
را مشخص مي كند . بعبارت ديگر اسم آرايه آدرس اولين محلي را كه عناصر آرايه از
آنجا به بعد در حافظه قرار مي گيرند در خود نگهداري مي كند . بعنوان مثال اگر
آرايه اي بصورت table[8] تعريف كرده باشيم و اولين عنصر آرايه در محل 400 حافظه
قرار داشته باشد و اشاره گري بنام ptr بصورت زير تعريف كرده باشيم ، int * ptr;

دستور ptr = & table[0] آدرس شروع آرايه يعني 400 را در اشاره گر ptr قرار
مي دهد ( اين دستور معادل دستور ptr = table; است ) و دستور t = * ptr محتويات
اولين محل آرايه ( اولين عنصر آرايه ) يعني (table[0]) را در متغيرt قرار داده
دستور * ptr = 0 محتويات اولين محل آرايه table را برابر با صفر قرار مي دهد .
با مطالبي كه تاكنون گفته شد براي دسترسي به عناصر آرايه علاوه بر انديس ، از
اشاره گرها نيز مي توان استفاده كرد :
آدرس آرايه را در اشاره گر ptr قرار مي دهد ptr= table;
به دومين عنصر آرايه اشاره مي كند (table[1]);(َptr+ 1) *
به i+1 امين عنصر آرايه اشاره مي كند ;(ptr+i) *

مثال : برنامه اي كه 5 مقدار را از ورودي خوانده و در آرايه اي قرار مي دهد .
سپس آنها را از آخرين مقدار به اولين مقدار به خروجي منتقل مي كند . main)(
{
int arr[5] /i ;
printf("\n enter five value: " );
for(i=0 ; i<5 ; i++)
scanf("%d"/&arr[i] );
printf("\n the reverse output is: ");
for(i=4 ; i>=0 ; i) --
printf("%4d"/*(arr+i ));
}

نمونه اي از خروجي برنامه مثال بالا : enter five value: 10 20 30 40 50
the reverse output is:50 40 30 20

نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 14 تیر1384   10:43 \

اعمال روي اشاره گرها

دسته بندی : / لینک ثابت

اعمالي كه بر روي اشاره گرها فايل انجام است به وسعت اعمالي كه بر روي ساير
متغيرهاي حافظه انجام پذير است ، نيست . اعمالي كه بر روي اشاره گرها انجام
پذيرند عبارتند از : 1
عمل انتساب : همچون ساير انواع متغيرها، ميتوان مقداري را به يك اشاره گر
نسبت داد ( مثال 1 ) . 2
اعمال محاسباتي : دو نوع اعمال محاسباتي مي توان بر روي اشاره گرها انجام
داد كه عبارتند از :
الف ) عمل جمع .
ب ) عمل تفريق .

مثال 1: main)(
{
int x ;
int *p1 / *p2 ;
p1=&x ;
p2=p1 ;
printf("\n the address of x is: ");
printf("%p"/p2 );
}

نمونه اي از خروجي برنامه مثال 1 : the address of x is:692B:0fDC

براي پي بردن به چگونگي عمل جمع و تفريق روي اشاره گرها فرض كنيد كه p
اشاره گري از نوع " صحيح " است و به ملح 2000 حافظه اشاره مي كند . اكنون دستور p + +;
را اجرا كنيم محتويات جديد اشاره گر p ، برابر با 2002 خواهد بود . زيرا
طول نوع " صحيح " برابر با 2 بايت است و با افزايش يك واحد به اشاره گر ، به
اندازه طول نوع اشاره گر به آن افزوده خواهد شد و نه به اندازه يك واحد . اگر
دستور ; - p- را صادر كنيم ، اشاره گر P مجددا" به محل 2000 حافظه اشاره خواهد
كرد . اگر باز هم دستور ; - p- را صادر كنيم اين بار به محل 1988 اشاره خواهد
كرد ( شكل 1 ) . char *ch= 2000;
int *i=2000;


ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch | 2000 | i

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+1 | 2001 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+2 | 2002 | i+1

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+3 | 2003 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+4 | 2004 | i+2

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+5 | 2005 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
حافظه
شكل (1) . انجام اعمال محاسباتي روي اشاره گر
3
مقايسه اشاره گرها : بااستفاده از عملگرهاي رابطه اي مي توان اشاره گرها را
با يكديگر مقايسه نمود. بعنوان مثال ، اگر pو qو از نوع اشاره گر باشند ، دستور
زير معتبر است : if(p < q )print f("p points to lower memory than q");

مقايسه اشاره گرها معمولا" در مواردي استفاده مي شود كه دو يا چند اشاره گر به اشاره مي كنند .


نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 14 تیر1384   10:39 \

عملگرهاي اشاره گر

دسته بندی : / لینک ثابت

دو عملگر در مورد اشاره گرها مورد استفاده قرار مي گيرند كه عبارتند از : *
و & . عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند . بعنوان
مثال دستور m = &name موجب مي شود تا آدرس متغير name در متغير m قرار گيرد .
عملگر * همانند عملگر & يك عملگر يكاني است ، محتويات يك آدرس حافظه را مشخص
مي كند . بعنوان مثال دستور p = m; موجب مي شود تا محتويات محلي كه آدرس آن در m
است به p منتقل گردد . بنابراين مجموعه دستورات (1) و (2) كه در ذيل آمده اند
معادل يكديگرند .
ؤ m= &name;
(َ1) ؤ
ؤ p= *m;
p= nam;( 2)

نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 14 تیر1384   10:30 \

اشاره گرها و رشته ها

دسته بندی : / لینک ثابت

چون رشته ها در زبان C بصورت آرايه تعريف مي شوند بين آنها و اشاره گرها نيز
ارتباط نزديكي وجود دارد . بطوري كه بسياري از توابع كتابخانه اي كه با رشته ها
سر و كار دارند ، ارتباط نزديكي با اشاره گرها پيدا مي كنند . بعنوان مثال تابع
()strchr كه محل اولين وقوع كاراكتري را در رشته اي پيدا مي كند بصورت زير
استفاده مي شود :
) <رشته > و <كاراكتر مورد جستجو>(= strchr اشاره گر

مثال 1: برنامه اي كه يك رشته و كاراكتري را از ورودي خوانده و محل اولين
وقوع اين كاراكتر را در رشته پيدا مي كند . main)(
{
char ch/line[81]/*ptr/*strchr )(;
printf("\nenter string to search:\n");
gets(line );
printf("\n enter a character: " );
ch=getche )(;
ptr=strchr(line/ch );
printf("\n the string start at " );
printf("address:%u/line" );
printf("\n first occurence of" );
printf(" <%c> is address:%u"/ch/ptr);
printf("\n this is position:" );
printf("%d( start from 0)"/ptr-line);
}

نمونه اي از خروجي برنامه مثال 1 : enter string to search:
c has no bound checking.
enter a character: k
the string start at address:3984

first occurence of is address:8291
this is position:20(start from 0 );

همانطوريكه ازخروجي برنامه مثال 1 پيداست تابع strchr با جستجوي يك كاراكتر
در يك رشته ، آدرس اين كاراكتر را بعنوان نتيجه عمل مشخص ميكند و در يك اشاره گر
قرار مي دهد . همانطور كه قبلا" گفته شد ، اگر تابعي داراي نوعي غير از "صحيح "
باشد بايد در تابع فراخواننده ، نوع آن به كامپايلر اعلام گردد . لذا در مثال
(َ1) نوع تابع ()strchr بصورت اشاره گر به كاراكتر تعريف شده است . البته اگر با
استفاده از دستور پيش پردازنده # include فايل "string" به برنامه معرفي گردد
نيازي به تعريف اين تابع بصورت اشاره گر نيست .

مثال 2: برنامه اي كه رشته اي را از ورودي دريافت كرده و كليه حروف كوچك اين
رشته را به حروف بزرگ تبديل مي كند . main)(
{
char s[50] ;
printf("enter a string in");
printf(" lowercase:\n");
gets(s );
upper(s );
printf("\n uppercase of");
printf(" string is:\n");
puts(s );
}

upper(char *string)
{
while(*string)
{
if(*string>='a' && *string<='z')
*string=*string-32 ;
string++ ;
}
}

نمونه اي از خروجي برنامه مثال 2 : enter a string in lowercase:
in c all keyword are lowercase.
uppercase of string is:
IN C ALL KEYWORD ARE LOWERCASE.


مثال 3: برنامه اي كه رشته اي را از ورودي خوانده و كليه حروف بزرگ موجود در
رشته را به حروف كوچك تبديل مي كند : main)(
{
char s[50] ;
printf("enter a string in");
printf(" uppercase:\n");
gets(s );
upper(s );
printf("\n lowercase of string");
printf(" is:\n");
puts(s );
}

upper(char *string)
{
while(*string)
{
if(*string>='A' && *string<='Z')
*string+=32 ;
string++ ;
}
}

نمونه اي از خروجي برنامه مثال 3 : enter a string in uppercase:
THIS IS A TEST FOR CONVERT TO LOWER.
lowercase of string is:
this is a test for convert to lower.


مثال 4: برنامه اي كه يك رشته و كاراكتري را از ورودي خوانده و تعداد دفعات
تكرار اين كاراكتر را رشته مشخص مي كند . main)(
{
char string[40] / ch ;
int count ;
printf("enter string for search:\n");
gets(string );
printf("\n enter a character:" );
ch=getche )(;
count=char_count(string/ch );
printf("\n number of occurs of " );
printf("char <%c> is:%d"/ch/count );
}

char_count(char *s/char letter)
{
int count=0 ;
while(*s)
if(*s++==letter)
count ++ ;
return(count );
}

نمونه اي از خروجي برنامه مثال 4 : enter string for search:
this is a simple test.
enter a character:
number of occurs of char is:3


مثال 5: برنامه اي كه رشته عددي را از ورودي خوانده و سپس آن را به مقدار
عددي تبديل مي كند . main)(
{
int number ;
char s[10] ;
printf("\n string representation");
printf(" of numeric:" );
gets(s );
ascii_to_int(&number/s );
printf("\n numeric value of ");
printf("string is:%d"/number );
}

ascii_to_int(int *value/char *str)
{
int sign=1 ;
*value=0 ;
while(*str==' ' )str++ ;
if(*str=='-' || *str=='+')
sign=(*str++=='-' )?- 1:1;
while(*str)
if((*str>='0' )&&( *str<='9'))
*value=(*value*10)+(*str++- 48 );
else
{
printf("Watning: the<%c> is:"/*str);
printf(" invalid character." );
exit(0 );
}
*value *=sign ;
}


خروجي هاي حاصل از 4 بار اجراي برنامه مثال 5 : string representation of a numeric-:342( 1)
numeric value of string is-:342

string representation of a numeric:+2341( 2)
numeric value of string is:+2341

string representation of a numeric:543( 3)
numeric value of string is:543

string representation of a numeric:45y4( 4)
Watning: the is invalid character.


مثال 6: برنامه اي كه عددي را از ورودي خوانده و سپس آن را به رشته تبديل
مي كند . main)(
{
int number ;
char s[10] ;
printf("\n enter a number: " );
scanf("%d"/&number );
int_to_ascii(number/s );
printf("\n the string value is:%s"/s);
}

int_to_ascii(int*value/char *str)
{
int sign=value ;
char temp / *savestr=str ;
if(value<0)
value*=-1 ;
do{
*str++=(value % 10)+48 ;
value=value/10 ;
} while(value>0 );
if( sign<0)
*str++='-' ;
*str-- ='\0' ;
while(savestr {
temp=*str ;
*str--=*savestr ;
*savestr++=temp ;
}
}

نمونه اي از خروجي برنامه مثال 6 : enter a number:2341
the st

نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 14 تیر1384   10:27 \

اشاره گرها

دسته بندی : / لینک ثابت

درك صحيح مفهوم اشاره گرها در زبان C بزرگترين موفقيت يك برنامه نويس است .
زيرا استفاده از اشاره گرها ويژگيهاي زير را دارد : 1
عمل تخصيص حافظه پويا امكان پذير است . 2
موجب بهبود كارآيي بسياري از توابع مي شود . 3
كار با رشته ها و آرايه ها را آسانتر مي كند . 4
فراخواني با ارجاع در توابع ، از طريق اشاره گرها امكان پذير است .
كليه متغيرهايي كه در برنامه ها مورداستفاده قرار ميگيرند در حافظه كامپيوتر
ذخيره مي شوند ( محل هايي از حافظه هستند ) . بنابراين هر متغير داراي يك آدرس
منحصر بفردي است كه توسط آن مي توان به متغير دسترسي پيدا كرد. اشاره گرها حاوي
آدرس متغيرهاي حافظه هستند. بعبارت ديگر اگر متغيري آدرس متغير ديگر را در خود
نگهداري كند به متغير اول يك اشاره گر گفته مي شود . بعنوان مثال ، اگر محتويات
متغيري كه در محل 1000 حافظه قرار دارد برابر با 1004 باشد ، اين متغير به محل 1004
حافظه اشاره خواهد كرد ( شكل 1 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
محتويات حافظه | آدرس حافظه
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤ 1004 | 1000 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1001 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1002 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1003 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
<ؤؤؤؤ| | 1004
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1005 | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (1) . مفهوم اشاره گر

براي تعريف متغيرهاي اشاره گر از روش كلي زير استفاده مي شود :
نام متغير اشاره گر * نوع
نوع ، يكي از انواع معتبر در زبان C است . نوع اشاره گر مشخص مي كند كه اين
اشاره گر بايد به چه نوع داده اي اشاره كند ( سر و كارش با چه نوع داده اي است ).
در زبان C برخلاف زبان هايي مثل PL/I اشاره گرها داراي نوع هستند. لذا دراستفاده
از اشاره گرها بايد دقت كافي بخرج داد تا نتيجه نادرستي از برنامه حاصل نگردد .
بعنوان مثال ، دستور int *p; متغير p را از نوع اشاره گر تعريف مي كند كه فقط
بايد به متغيرهاي از نوع "صحيح " اشاره نمايد. البته اگر اشاره گرp به متغيرهايي
از انواع ديگر اشاره نمايد ، كامپايلر زبان C خطايي را به برنامه نويس اعلام
نمي كند ولي برنامه نويس بايد بداند كه اين امر يقينا" در نتيجه اجراي برنامه
اثر گذاشته و موجب عدم صحت اجراي برنامه گشته و به نتايج حاصل از برنامه
اطميناني نيست . بعنوان مثال در حين اجراي برنامه زير از طرف كامپايلر خطايي
گزارش نخواهد شد ولي مي دانيم كه اين برنامه نتيجه مطلوبي نخواهد داشت . main)(
{
float x/y ;
int *p ;
p=&x ;
y=*p ;
}

در برنامه فوق ، چون p به متغير x اشاره ميكند و p از نوع " صحيح " است ، x
را بصورت عدد " صحيح " در نظر ميگيرد و در دستور بعدي كه محتويات محلي كه p به را به y منتقل مي كند، عمل انتقال به درستي انجام نميشود.


نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 14 تیر1384   10:12 \