ارزش دهی اولیه رشته ها به عنوان اشاره گر
در این قسمت می خواهیم مشخص کنیم که چگونه میتوان رشته ها را بعنوان اشاره گر
مقدار اولیه داد . برای روشن شدن موضوع ، به مثال ۱ توجه نمایید .
مثال ۱: main)(
{
char *text=”your name is:”;
char name[41] ;
printf(“\n enter your name: ” );
gets(name );
printf(“\n\n %s text” );
puts(name );
}
نمونه ای از خروجی برنامه مثال ۱ : enter your name:mohammad
your name is:mohammad
اولین دستور مثال ۱ را بصورت زیر نیز می توان نوشت : static char text[] = “your name is:”;
این دو دستور از نظر اثری که در حافظه می گذارند تفاوتی با یکدیگر ندارند .
ولی چون دستوری که در برنامه آمده است متغیر text را بصورت اشاره گر تعریف کرده
است ، قابلیت انعطاف بیشتری به این متغیر داده است . این امر باعث شده است که
با دستور ساده ;(text++)puts رشته text کاراکتر به کاراکتر به خروجی منتقل گردد
که نتیجه زیر حاصل خواهد شد : your name is:
وقتی که رشته ها به صورت اشاره گر تعریف می شوند ، بخصوص در مواقعی که طول
عناصر مختلف آن ، متفاوت باشند موجب صرفه جویی در میزان حافظه می گردند ( مثال ( . ۲
مثال ۲: برنامه ای که برای ذخیره کردن نام های تعدادی از افراد ، از آرایه ای
از اشاره گرها استفاده می کند. این برنامه با خواندن نام ۵ نفر از ورودی ، آنها
را در آرایه ای قرار داده ، سپس نامی را از ورودی دریافت می کند و تشخیص می دهد
که آیا این نام در لیست وجود دارد یا خیر . 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);
}
نمونه ای از خروجی برنامه مثال ۲ : enter a name for search: ali
name exist.
اگر در مثال ۲ فرض شود که اولین عنصر آرایه list ( که حاوی ۵ نام است ) در
محل ۱۰۰۰ حافظه قرار داشته باشد . این آرایه بصورتی که در شکل (۱) آمده است در
حافظه قرار می گیرد .
اگر درمثال ۲ بجای تعریف آرایه ای از اشاره گرها، آرایه ای از رشته ها را تعریف
میکردیم آنگاه می بایست آرایه list بصورت آرایه ای دو بعدی تعریف میشد که تعداد
سطرهای آن برابر با تعداد افراد ( تعداد عناصر آرایه ) و تعداد ستون های آن
برابر با طول طولانی ترین نام موجود بود ( شکل ۲ و مثال ۳ ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ |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]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ
شکل (۱) . نحوه قرار گرفتن آرایه ای از اشاره گرها در حافظه ، شامل ۵ نام
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | | |
|
|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]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شکل (۲) . نحوه قرار گرفتن آرایه ای از رشته ها در حافظه ، شامل ۵ نام
با توجه به نحوه ذخیره شدن اطلاعات در اشکال ۱و ۲و ذخیره کردن رشته ها بصورت
آرایه ای از اشاره گرها در صرفه جویی میزان حافظه بسیار موثر است ولی در همه حالات
اینطور نیست . بعنوان مثال اگر طول همه رشته ها ۱۲ باشد ( به اندازه بزرگترین
طول رشته در مثال ۲ )، حافظه تخصیص یافته در روش اول ( آرایه ای از اشاره گرها )
دارای ۵ اشاره گر اضافی خواهدبود که حافظه بیشتری را نسبت به روش دوم ( آرایه ای
از رشته ها ) اشغال می کند . مزیت عمده بیان رشته ها بصورت آرایه ای از اشاره گرها
سرعت بالاتر و سهولت دسترسی به عناصر آنها است . زیرا نیازی به انجام محاسبات
جهت دسترسی به عناصر آرایه نیست .
مثال ۳: برنامه ای که نام تعدادی از افراد را از ورودی خوانده و در یک آرایه
قرار می دهد . سپس با استفاده از آرایه ای از اشاره گرها ، آن را مرتب می کند و
نتیجه را به خروجی می برد . 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]);
}
نمونه ای از خروجی برنامه مثال ۳ : 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
برای توضیح بیشتر در مورد چگونگی مرتب کردن رشته ها از طریق آرایه ای از
اشاره گرها ، به شکل های ۳و ۴و که بیانگر نحوه قرار گرفتن عناصر آرایه در حافظه
قبل و بعد از مرتب شدن هستند توجه نمایید .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |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]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ
شکل (۳) . وضعیت اشاره گرها قبل از مرتب شدن
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ |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]
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ
شکل (۴) . وضعیت اشاره گرها بعد از مرتب شدن
نکته ای که در مورد مثال ۳ باید مورد توجه قرار گیرد این است که آرایه name
بصورت دو بعدی تعریف شده است ولی در حین دسترسی به عناصر آن ، بصورت یک بعدی
مورد استفاده قرار گرفته است . این مساله بدین دلیل است که در زبان C قسمتی از
آرایه را می توان بصورت یک آرایه فرض کرد . بعبارت دیگر ، در یک آرایه دو بعدی
هر سطر را می توان بصورت یک آرایه یک بعدی در نظر گرفت . لذا می توان گفت که
آرایه دو بعدی ، آرایه ای از آرایه های یک بعدی است . بعنوان مثال در دستور : static char name[30][81];
آرایه name یک آرایه دو بعدی تعریف شده است که میتوان آن را بصورت یک آرایه
یک بعدی با تعداد ۳۰ عنصر در نظر گرفت که هر عنصر آن نیز یک آرایه یک بعدی به
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن