PDA

View Full Version : مبتدی: اشاره گر ها



raminlich
سه شنبه 06 خرداد 1393, 17:53 عصر
سلام این اشاره گر ها چیه مزیتشون
یه سری سورس ازتو http://www.cplusplus.com دیدم
ولا کار مثبت این شاره گر هار نفهمیدم اگه میشه اینارو توضیح بدین لطفا
#include <iostream>
using namespace std;

int main ()
{
int firstvalue, secondvalue;
int * mypointer;

mypointer = &firstvalue;
*mypointer = 10;
mypointer = &secondvalue;
*mypointer = 20;
cout << "firstvalue is " << firstvalue << '\n';
cout << "secondvalue is " << secondvalue << '\n';
return 0;
}
اگه می شه یه مثال با توضیح بزنید یه کار مثبتی هم انجام بدن تو برنامه

vahid-p
سه شنبه 06 خرداد 1393, 18:26 عصر
اشاره گر ها خیلی مفیدن. اصولا تو برنامه نویسی شی گرا به صورت وسیع از اشاره گر ها استفاده میشه.

حالا اینجا چون متغیر int هست و primitive type هستند، زیاد خاصیتش رو درک نمیکنی.
ولی بذار اینجوری بگم، شما یک شی دارید و یک اشاره گر. شی بخشی از حافظه رو میگیره، و اشاره گر به اون بخش از حافظه اشاره میکنه و در هر موقعیتی این قابلیت رو داره که اشاره گر به شی دیگری از اون نوع اشاره کنه.
مثلا من میگم 10 تا بادکنک داریم. یک اشاره گر داریم که هر بار به یک بادکنک اشاره میکنه. خب برای اینکه هر ده بادکنک رو بترکونم، میام اون اشاره گر ( مثل هدف ) روی اون بادکنک قرار میدم و میگم مثلا target->shot() . خب اینو یه بار مینویسی، حالا بستگی داره اون target به کدوم از این اشیا ( بادکنک ) اشاره کنه، اونو نابود میکنه. این مفهومش بود.

در مورد int ,... اگر همینجوری مقدارش رو عوض کنی، واقعا مقدار اون عدد تو حافظه عوض میشه. ولی اگر اشاره گرش رو عوض کنی، اونوقت اون عدد در حافظه میمونه، فقط این متغیر میره سراغ یه جای دیگه تو حافظه و اونوقت میتونی اون مقدار جدیدی که تو حافظه است رو تغییر بدی ( دیگه دسترسی به عدد قبلی قطع شده )

raminlich
چهارشنبه 07 خرداد 1393, 15:36 عصر
سلام به همه
میشه لطف کنین این برنامه رو برام توضیح بدین؟نمی دونم چرا این شاره گر هارو نمی فهمم
#include <iostream>
using namespace std;

int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}

rahnema1
چهارشنبه 07 خرداد 1393, 19:14 عصر
آرایه ها در واقع همون اشاره گر هستند
int numbers[5];
numbers در واقع یک اشاره گر هست که داره به یک جای حافظه اشاره می کنه. همون جایی که اولین عنصر آرایه قرار گرفته

int * p;
ما یک اشاره گر به نام p تعریف می کنیم

p = numbers;
اشاره گر P را برابر numbers قرار می دهیم. یعنی p الان داره به اولین عنصر آرایه اشاره می کنه

*p = 10;
محتوای p را برابر 10 قرار می دهیم. چون p آدرس اولین عنصر آرایه بود بنابراین محتوای اولین عنصر آرایه برابر 10 میشه

p++;
یکی به اشاره گر اضافه می کنیم در اینجا یعنی اشاره گر به خانه دوم آرایه اشاره می کنه

*p = 20;
محتوای خانه دوم برابر 20 قرار می دهیم

p = &numbers[2];
آدرس خانه سوم آرایه را به دست میاریم و اون را به P اختصاص می دهیم یعنی حالا P به سومین خانه آرایه اشاره می کنه

*p = 30;
محتوای خانه سوم برابر 30 قرار می دهیم

p = numbers + 3;
numbers که آدرس اولین خونه حافظه بود را با 3 جمع می کنیم که آدرس خونه چهارم به دست میاد و P برابر آدرس خونه چهارم میشه

*p = 40;
خونه چهارم میشه 40

p = numbers;
دوباره P به اولین خونه آرایه اشاره می کنه

*(p+4) = 50;
محتوای خونه p+4 از حافظه برابر 50 میشه یعنی خونه پنجم

حالا ماتریس را چاپ می کنیم

(while(c=1) printf(cpp=0
چهارشنبه 07 خرداد 1393, 20:22 عصر
#include <iostream>
using namespace std;

int main ()
{
int numbers[5]; //متغیری از نوع آرایه ای با شِش خانه
int * p;
p = numbers; *p = 10; //صِفرمین خانه آرایه حاوی عدد دَه شد
p++; *p = 20; //توسط پی پلاس پلاس، اشاره گر پی به خانه اولِ متغیر نامبرز رجوع و اشاره می کنه و عدد بیست در خانه اول جا میگیره
p = &numbers[2]; *p = 30; //اشاره گر به خانه دوم متغیر نامبرز اشاره می کنه و عدد سی رو درون خانه دوم جا میده
p = numbers + 3; *p = 40; //اشاره گر به خانه سوم متغیر نامبرز اشاره می کنه و عدد چهل رو درون خانه سوم جا میده
p = numbers; *(p+4) = 50; //اشاره گر به خانه چهارم متغیر نامبرز اشاره می کنه و عدد پنجاه رو درون خانه چهارم جا میده

for (int n=0; n<5; n++) //از خانه صفر تا خانه چهارم مقدار دهی شدن، اما خانه پنجم خالیه. بنابراین اگر
//نوشته بشه اِن کوچکتر یا مساوی پنج، خانه پنجم چاپ میشه منتها چون که مقداری بهش
//.اختصاص داده نشده، عدد صفر چاپ میشه

cout << numbers[n] << ", "; //مقدار داخل خانه ها به ترتیب چاپ میشن
return 0;
}




دقت کن که خانه سوم و چهارم شبیه به هم هستن. خانه سوم می تونست اینطوری نوشته بشه: p = &numbers[0] + 3
خانه چهارم با این دستور مساویه : p = numbers + 4

در خانه دوم، p داره مستقیما به خانه دوم متغیر numbers اشاره می کنه.
خانه اول با این دستور مساویه: p = numbers + 1

برنامه به خاطر جمع و جور شدن، دو دستوری کنار هم نوشته شده. مثلا این دو دستور رو که می بینی ;p = numbers; *p = 10 اولویت با سمت چپی هستش، و بعد نوبت به سمت راستی میرسه.
در کُل فقط به نحوه پر شدن خانه های آرایه توجه کن. همین.
خانه های آرایه از صفر شروع میشن -- بنابراین [5] در اصل 6 خانه هست که از صفرمین تا چهارمین خانه مقداردهی شدن (که میشه پنج خانه)، و در حلقه for هم گفته شده از صفرمین خانه تا چهارمین خانه. اگر در حلقه for نوشته شده بود n = 1 چی می شد؟ اونوقت نتیجه می شد : 50 40 30 20.
با خانه پنجم کاری نداریم چون مقدار دهی نشده.
خانه صفرم مثل طبقه هم کفِ ساختمان های شهر می مونه. ساختمانه 5 طبقه هست، ولی به علاوه طبقه هم کف میشه 6 طبقه. به همین دلیله که صفر، اولین خانه حساب میشه.

موفق باشی.

(while(c=1) printf(cpp=0
چهارشنبه 07 خرداد 1393, 20:50 عصر
rahnema1
خانه پنجم اصلا مقدار دهی نشده.
از صفر تا چهار مقدار دهی شده،; اما اگر به صورت تعدادی بخوایم حساب کنیم، میشه خانه پنجم.