...StacK...
چهارشنبه 27 آذر 1387, 12:59 عصر
به نام حق
فرض کنید ما یک ارایه(رشته ای) از اشاره گر ها داریم مانند زیر:
[char *iran[10
حالا 10 رشته رو به 10 اشاره گر میدیم .... برای اینکه
پایان یک رشته مثل "barnamenevis" مشخص شه از کاراکتر \0 نال استفاده میشه
ایا این کاراکتر در حافظه هم ذخیره میشه یا نه؟؟؟؟
اگر مثلا اشاره گر [0]iran به رشته ی "barnamenevis" اشاره کنه , این رشته در
حافظه به صورت barnamenevis\0 ذخیره میشه(البته هر کاراکتر در یک بایت)
یا در یک رشته که بعد از اخرین کاراکتر رشته , 0\ قرار میگیره .
این نال برای فهم کامپایلر هست که بدونه به اخر رشته رسیده, یا اینکه در حافظه هم ذخیره میشه؟؟
بزارید مسئله رو با یک مثال باز کنم:این کد رو ببینید:(یه برنامه که یه ارایه از اشاره گر تعریف میکنه و چند رشته
رو به اشاره گر ها تخصیص میده و بعد یک رشته از ورودی میخونه و باید تشخیص بده که این رشته وجود داره یا نه...)
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define k 5
int main(void)
{
int dex;
char name[21];
char *list[k]=
{"ali",
"ahmad",
"saeed",
"morteza",
"abolfazl"
};
printf("\n enter a name for search:");
gets(name);
for(dex=0;dex<k;dex++)
if(!strcmp(list[dex],name))
break;
if(dex==k)
printf("\n name<%s> not exist.",name);
else
printf("\n name <%s> exist.",name);
getche();
printf("\n chape address jaee ke esharegar be oonja eshare mikone<%p>:",list[0]);
printf("\n chape mohtaviyate jaee ke pointer be onja eshare mikone:<%s>:",list[4]);
getche();
return 0;
}
به این تابع printf که نوشتم نگاه کنید:
printf("\n chape address jaee ke esharegar be oonja eshare mikone<%p>:",list[0])تصور من از این خط از کد که نوشتم اینه که ادرس اون بایت از حافظه که کاراکتر a رو در خودش داره رو برام چاپ کنه
یعنی ادرس اولین بایت از رشته ali که میشه a ,که با تست برنامه یک ادرس به من داد....
ایا تصور من درست هست؟؟؟ ایا این ادرس همون ادرس a هست؟؟؟
چه جوری این موضوع رو به خودم اثبات کنم.... وقتی به جای %p از %c استفاده میکنم به جای اینکه اون کاراکتر
رو به من نشون بده اولین عدد از همون ادرس یعنی 0 رو به من میده.
حالا برای اینکه بخوام به ادرس چهارمین بایت از رشته ali , با فرض اینکه 0\ باشه دسترسی پیدا کنم و این کاراکتر رو
چاپ کنم باید چیکار کنم؟؟؟؟
خروجی این برنامه به صورت زیر است- وقتی که در این
printf("\n chape address jaee ke esharegar be oonja eshare mikone<%c>:",list[0]);
خط کد از c% استفاده میکنم:
enter a name for search:ali
name <ali> exist.
chape address jaee ke esharegar be oonja eshare mikone<0>:
chape mohtaviyate jaee ke pointer be onja eshare mikone:<abolfazl>:
و خروجی اون زمانی که از p% استفاده میکنم به صورت زیر است:
enter a name for search:ali
name <ali> exist.
chape address jaee ke esharegar be oonja eshare mikone<00421130>:
chape mohtaviyate jaee ke pointer be onja eshare mikone:<abolfazl>:
دوستان لطف کنید یک پاسخ کامل بدید که کاملا منو قانع کنه....و الا تا فردا سکته مغزی میکنم
فرض کنید ما یک ارایه(رشته ای) از اشاره گر ها داریم مانند زیر:
[char *iran[10
حالا 10 رشته رو به 10 اشاره گر میدیم .... برای اینکه
پایان یک رشته مثل "barnamenevis" مشخص شه از کاراکتر \0 نال استفاده میشه
ایا این کاراکتر در حافظه هم ذخیره میشه یا نه؟؟؟؟
اگر مثلا اشاره گر [0]iran به رشته ی "barnamenevis" اشاره کنه , این رشته در
حافظه به صورت barnamenevis\0 ذخیره میشه(البته هر کاراکتر در یک بایت)
یا در یک رشته که بعد از اخرین کاراکتر رشته , 0\ قرار میگیره .
این نال برای فهم کامپایلر هست که بدونه به اخر رشته رسیده, یا اینکه در حافظه هم ذخیره میشه؟؟
بزارید مسئله رو با یک مثال باز کنم:این کد رو ببینید:(یه برنامه که یه ارایه از اشاره گر تعریف میکنه و چند رشته
رو به اشاره گر ها تخصیص میده و بعد یک رشته از ورودی میخونه و باید تشخیص بده که این رشته وجود داره یا نه...)
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define k 5
int main(void)
{
int dex;
char name[21];
char *list[k]=
{"ali",
"ahmad",
"saeed",
"morteza",
"abolfazl"
};
printf("\n enter a name for search:");
gets(name);
for(dex=0;dex<k;dex++)
if(!strcmp(list[dex],name))
break;
if(dex==k)
printf("\n name<%s> not exist.",name);
else
printf("\n name <%s> exist.",name);
getche();
printf("\n chape address jaee ke esharegar be oonja eshare mikone<%p>:",list[0]);
printf("\n chape mohtaviyate jaee ke pointer be onja eshare mikone:<%s>:",list[4]);
getche();
return 0;
}
به این تابع printf که نوشتم نگاه کنید:
printf("\n chape address jaee ke esharegar be oonja eshare mikone<%p>:",list[0])تصور من از این خط از کد که نوشتم اینه که ادرس اون بایت از حافظه که کاراکتر a رو در خودش داره رو برام چاپ کنه
یعنی ادرس اولین بایت از رشته ali که میشه a ,که با تست برنامه یک ادرس به من داد....
ایا تصور من درست هست؟؟؟ ایا این ادرس همون ادرس a هست؟؟؟
چه جوری این موضوع رو به خودم اثبات کنم.... وقتی به جای %p از %c استفاده میکنم به جای اینکه اون کاراکتر
رو به من نشون بده اولین عدد از همون ادرس یعنی 0 رو به من میده.
حالا برای اینکه بخوام به ادرس چهارمین بایت از رشته ali , با فرض اینکه 0\ باشه دسترسی پیدا کنم و این کاراکتر رو
چاپ کنم باید چیکار کنم؟؟؟؟
خروجی این برنامه به صورت زیر است- وقتی که در این
printf("\n chape address jaee ke esharegar be oonja eshare mikone<%c>:",list[0]);
خط کد از c% استفاده میکنم:
enter a name for search:ali
name <ali> exist.
chape address jaee ke esharegar be oonja eshare mikone<0>:
chape mohtaviyate jaee ke pointer be onja eshare mikone:<abolfazl>:
و خروجی اون زمانی که از p% استفاده میکنم به صورت زیر است:
enter a name for search:ali
name <ali> exist.
chape address jaee ke esharegar be oonja eshare mikone<00421130>:
chape mohtaviyate jaee ke pointer be onja eshare mikone:<abolfazl>:
دوستان لطف کنید یک پاسخ کامل بدید که کاملا منو قانع کنه....و الا تا فردا سکته مغزی میکنم