...StacK...
شنبه 12 بهمن 1387, 23:31 عصر
سلام دوستان لطفا به کد زیر نگاه کنید:
// stack.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
int sum(int (*)(int),int);
int square(int);
int cube(int);
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sum(square,4)<<endl;
cout<<sum(cube,4)<<endl;
return 0;
}
//start the sum function
int sum(int (*pf)(int k), int n)
{
int s=0;
for(int i=1;i<=n;i++)
s +=(*pf)(i);//به این دستور دقت کنید
return s;
}//end of sum function
//start the square function
int square(int k)
{
return k*k;
}
//end of square function
int cube(int k)
{
return k*k*k;
}
به اون قسمتی که در کد تعیین کردم توجه کنید , وقتی من اون قطعه از کد رو
به این صورت مینویسم هیچ تغییر و مشکلی در خروجی برنامه پیش نمیاد:
s +=(pf)(i);
پس چه نیازی هست من از * استفاده کنم؟؟؟؟
مگه عملگر * ادرس شروع تابع رو مشخص نمیکنه؟؟؟ پس وقتی من از این عملگر استفاده
نکنم بازهم ادرس درون pf مقدار یابی میشه؟؟؟
عملا این دو چه تفاوتی دارن؟؟؟
=====================================
به این قطعه کد نگاه کنید و به سوالی که در قطعه کد در قالب توضیح پرسیدم پاسخ بدید...
int f(int);
int (*pf)(int);
int (*ps)(int);
ps=&f;
pf=f;
if(*ps==pf);//ایا این شرط برقراره؟؟؟
و در اخر هم یه توضیح در مورد نام تابع بدید که یک اشاره گر ثابت هست....
ایا در واقع اشاره گر تابع ادرس اولین بایت از شروع تابع در پشته رو در خودش نگه میداره؟؟؟
من فکر میکنم در این قطعه کد:
s +=(pf)(i);
ما به همون ادرس اشاره میکنیم
ولی در این یکی:
s +=(*pf)(i);
به مقدار اولین بایت از شروع تابع.....ایا درسته؟؟؟؟؟؟؟؟؟؟؟؟؟؟
یا اینکه هر دو فقط به اولین بایت از تابع اشاره میکنند و تابع رو اجرا میکنند؟؟؟؟
شرمنده سوالام زیاد شد ....
// stack.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
int sum(int (*)(int),int);
int square(int);
int cube(int);
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sum(square,4)<<endl;
cout<<sum(cube,4)<<endl;
return 0;
}
//start the sum function
int sum(int (*pf)(int k), int n)
{
int s=0;
for(int i=1;i<=n;i++)
s +=(*pf)(i);//به این دستور دقت کنید
return s;
}//end of sum function
//start the square function
int square(int k)
{
return k*k;
}
//end of square function
int cube(int k)
{
return k*k*k;
}
به اون قسمتی که در کد تعیین کردم توجه کنید , وقتی من اون قطعه از کد رو
به این صورت مینویسم هیچ تغییر و مشکلی در خروجی برنامه پیش نمیاد:
s +=(pf)(i);
پس چه نیازی هست من از * استفاده کنم؟؟؟؟
مگه عملگر * ادرس شروع تابع رو مشخص نمیکنه؟؟؟ پس وقتی من از این عملگر استفاده
نکنم بازهم ادرس درون pf مقدار یابی میشه؟؟؟
عملا این دو چه تفاوتی دارن؟؟؟
=====================================
به این قطعه کد نگاه کنید و به سوالی که در قطعه کد در قالب توضیح پرسیدم پاسخ بدید...
int f(int);
int (*pf)(int);
int (*ps)(int);
ps=&f;
pf=f;
if(*ps==pf);//ایا این شرط برقراره؟؟؟
و در اخر هم یه توضیح در مورد نام تابع بدید که یک اشاره گر ثابت هست....
ایا در واقع اشاره گر تابع ادرس اولین بایت از شروع تابع در پشته رو در خودش نگه میداره؟؟؟
من فکر میکنم در این قطعه کد:
s +=(pf)(i);
ما به همون ادرس اشاره میکنیم
ولی در این یکی:
s +=(*pf)(i);
به مقدار اولین بایت از شروع تابع.....ایا درسته؟؟؟؟؟؟؟؟؟؟؟؟؟؟
یا اینکه هر دو فقط به اولین بایت از تابع اشاره میکنند و تابع رو اجرا میکنند؟؟؟؟
شرمنده سوالام زیاد شد ....