PDA

View Full Version : سوال: حل یک برنامه



Samira Azad
یک شنبه 09 فروردین 1388, 01:18 صبح
LINE Contains
50 char * b, q, *r;
200 b=getbuf();
201 q = *b;
212 r= anotherfunction(b);
213-300 /* we want to use ‘q’ and ‘r’ here*/
2000 char * getbuf()
2001 {
2002 char buff[8];
2003-2050 /* unspecified, buff defined here *./
2051 return (char *) buff;
2052 }
طفا مقدارq را بعد از اجرای خط 201 بگوییدو در چه شرایطی مقدار q فرق خواهد کرد؟

nimvb123456
دوشنبه 10 فروردین 1388, 05:14 صبح
سلام
تو کد بالا توی خط 200 برنام به تابع getbuf میره. این تابع آدرس اولین عنصر از آرایه buff رو در b قرار میده.برای مثال کد زیر رو در نظر بگیرید:

#include <iostream.h>
#include <conio.h>
char *get();
int main()
{
char *b,q;
b=get();
q=*b;
cout<<"We Print Pointer b : "<<b<<endl;
cout<<"We Print The Data That Pointer b Point To :"<<*b<<endl;
cout<<"We Print q :"<<q;
getch();
return 0;
}
char *get()
{
char buff[8]="as";
cout<<"We Print Buff In The Function *get():"<<buff<<endl;
return (char *)buff;
}

وقتی برنامه تابع get رو اجرا میکنه و ما رشته buff رو به طور مثال با "as" مقداردهی کنیم,اگه دستور cout<<buff رو نوشته باشیم "as" چاپ میشه.وقتی به return میرسیم تابع آدرس اولین خانه رشته buff رو ارسال میکنه ولی چون buff یک آرایه محلیه بعد از return از بین میره,در نتیجه فقط اولین آدرس اون برای اشاره گر b قابل دسترسیه.
اما اگه کد زیر رو ببینین چون رشته ما به طور عمومی تعریف شده و تا آخر برنامه از بین نمیره اگه ما آدرس اولین خونه از buff رو به اشاره گره مون بفرستیم و اشاره گرمونو با cout چاپ کنیم,میبینیم که کل رشته buff چاپ میشه.

#include <iostream.h>
#include <conio.h>
char buff[8]="as";
char *get();
int main()
{
char *b,q;
b=get();
q=*b;
cout<<"We Print Pointer b : "<<b<<endl;
cout<<"We Print The Data That Pointer b Point To :"<<*b<<endl;
cout<<"We Print q :"<<q;
getch();
return 0;
}
char *get()
{
cout<<"We Print Buff In The Function *get():"<<buff<<endl;
return (char *)buff;
}
در واقع تو این برنامه مساله اصلی در محلی بودن buff هست,اگه buff محلی باشه آدرس اولین خونه از اون برای اشاره گر قابل دسترسیه و اگه ما b رو چاپ کنیم فقط a رو به ما میده و اگه buff عمومی تعریف شه اونوقت اگه b رو چاپ کنیم کل رشته "as" چاپ میشه.
در مورد q باید گفت اولین عنصر buff در q قرار میگیره چون اشارهگره b به اولین خانه buff اشاره میکنه و با استفاده از b* میشه محتویاتشو تو یک متغر قرار داد پس q=*b در واقع محتویات اولین خونهء buff رو داره.
اگه چیزیرو اشتباه گفتم از همه معذرت میخوام.
موفق باشید.

Samira Azad
دوشنبه 10 فروردین 1388, 21:36 عصر
ممنون
در خط 2000 از چه دستور دیگه ای میشه استفاده کرد که اینb=getbuf(); مفهوم رو بده
اصلا آیا دستور دیگه ای وجود داره؟

nimvb123456
سه شنبه 11 فروردین 1388, 01:01 صبح
ممنون
در خط 2000 از چه دستور دیگه ای میشه استفاده کرد که اینb=getbuf(); مفهوم رو بده
اصلا آیا دستور دیگه ای وجود داره؟

من دقیقا منظورتون رو متو جه نشدم.
ولی میتونم بگم که تو خط 2000 در واقع یک تابع تعریف میشه که کارش برگردوندن آدرس اولین عنصر buff هستش.
کاره دیگه ای که میتونید انجام بدیدید اینه که آرایه buff رو به صورت عمومی تعریف کنید و بعد آدرس اولین خونش رو به b نسبت بدید:

char buff[80];
char *b;
b=buff
==========یا===========
char buff[80];
char *b;
b=&buff[0];

موفق باشید