PDA

View Full Version : کاربرد اشاره گر چیست؟



simani
جمعه 25 تیر 1395, 17:19 عصر
سلام
من مفهوم اشاره گر رو متوجه شدم . مثلا محتویات جایی که p به اون اشاره کرده رو توی s میریزه.
int=*p,m,s;
m=5;
p=&m;
s=*p;
ولی در موارد پیشرفته تر از خود اشارگره استفاده شده بدون اینکه محتوای جایی در اون ریخته بشه مثل:
#include "stdafx.h"
#include <iostream>
#include <string>
#define size 3
using namespace std;
const int n=5;
int arr[n],i;
for(i=0;i<n;i++)
cin>>arr[i];


for(i=0;i<n;i++)
cout<<*(arr+i);

الان از *(arr+i) استفاده شده و خبری از & ادرس نیست.
یا موارد مشابه اون توی ارایه های پویا. پس قضیه& چی میشه که دیگه استفاده نمیشه؟
و اینکه کلا اشاره گر به غیر استفاده از حافظه پویا کاربرد دیگه ای داره؟
ممنون

1-9-7-2
دوشنبه 28 تیر 1395, 17:43 عصر
141559



141560

ciavosh
سه شنبه 29 تیر 1395, 23:37 عصر
مهم تر از همه این که در سی پلاس پلاس از اشاره گر استفاده نمیکنیم مگر این که دلیل خاصی داشته باشه. چنین موقعیتهایی معمولا در نوشتن برنامه های کاربردی معمولی پیش نمیاد و بیشتر در نوشتن کدهای Low-Level و کتابخانه ها به وجود میاد. در سی با رویکرد دیگری جلو میریم و خیلی عادی از اشاره گر استفاده میکنیم.
اشاره گر متغیری است که حاوی آدرس یک متغیر، آرایه، موجود ویا تابعه. در خانواده سی نوع اشاره گر در زمان کامپایل مشخصه. یعنی کامپایلر میدونه یک اشاره‌گر به چه نوع داده ای اشاره میکنه و سایز اون داده چه مقداره و نمیذاره یک «اشاره گر به عدد صحیح» به یک کاراکتر اشاره کنه.

عبارت
*p

دقیقاً معادل
p[0]

میباشد. یعنی دقیقاً همانطور که برای آرایه ها از کروشه استفاده میکنیم میتونیم برای اشاره گرها هم به همین صورت عمل کنیم. یعنی اگر یک اشاره گر به نام p به درایه اول یک آرایه اشاره کند
p[1]

برابر درایه دوم خواهد بود. همچنین میتونیم بنویسیم
*(p+1)


هیچ فرقی نداره. فقط نکتش اینه که با این که آرایه و اشاره گر رو میشه عین هم نوشت، با هم فرق دارن (http://www.cplusplus.com/forum/articles/9/).

عملگر & آدرس حافظه یک متغیر رو بر میگردونه.
int a;
int *p;
p=&a;
الان مقدار p* با a برابره.

simani
جمعه 01 مرداد 1395, 15:51 عصر
تشکر،
یعنی با این حساب دد c++ ، برنامه نویسی پیشرفته متناقضبا استفاده از اشاره گر است؟ یا در برنامه نویسی object-oriented نیز کاربرد دارد؟

ciavosh
جمعه 01 مرداد 1395, 17:14 عصر
منظور شما از برنامه نویسی پیشرفته چیست؟ ما مباحث و تکنینکهای پیشرفته برنامه نویسی رو داریم که در شرایطی بهتره یا لازمه ازشون استفاده کنیم. موضوع اینه که استفاده از اشاره‌گر ها مشکلات و خطرانی به همراه داره به همین دلیل کلاسهایی ساخته شده و در کتابخانه‌های عمومی قرار گرفته که فواید اشاره گر رو داره ولی خطراتش رو نداره. در ساخت این کلاس‌ها از اشاره گر استفاده میشه.

مثلا ما دوست داریم یک لیست داشته باشیم از اعداد. اگر این لیست رو به صورت یک آرایه تعریف کنیم:
int numlist[50];

مشکلاتی که خواهم داشت اینه که کد زیر به راحتی اجرا میشه بدون این که برنامه کرش کنه:
somevar=-1;
cout<<numlist[somevar];
و همچنین آرایه ۵۰ تا جا بیشتر نداره و ما اگر بخواهیم عدد ۵۱ رو بذاریم توش گیر میکنیم.

در عوض میایم یک کلاس تعریف میکنیم به نام vector. وکتور خودش برای عدد ها حافظه تخصیص میده و ما لازم نیست نگران اندازه لیستمون باشیم. همچنین توی این کلاس میایم [] رو مجدد تعریف میکنیم و در اونجا چک میکنیم که ایندکسمون از دامنه لیست خارج نشه . در نتیجه با استفاده از وکتور همون کار اشاره گر یا آرایه رو انجام میدیم بدون این که بخواهیم با مشکلاتشون دست و پنجه نرم کنیم.