# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  کاربرد اشاره گر چیست؟

## simani

سلام
من مفهوم اشاره گر رو متوجه شدم . مثلا محتویات جایی که 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

Capture.PNG



CaptureB.PNG

----------


## ciavosh

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

عبارت 
*p

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

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

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


هیچ فرقی نداره. فقط نکتش اینه که با این که آرایه و اشاره گر رو میشه عین هم نوشت، با هم فرق دارن.

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

----------


## simani

تشکر،
یعنی با این حساب دد C++‎ ، برنامه نویسی پیشرفته متناقضبا استفاده از اشاره گر است؟ یا در برنامه نویسی object-oriented نیز کاربرد دارد؟

----------


## ciavosh

منظور شما از برنامه نویسی پیشرفته چیست؟ ما مباحث و تکنینکهای پیشرفته برنامه نویسی رو داریم که در شرایطی بهتره یا لازمه ازشون استفاده کنیم. موضوع اینه که استفاده از اشاره‌گر ها مشکلات و خطرانی به همراه داره به همین دلیل کلاسهایی ساخته شده و در کتابخانه‌های عمومی قرار گرفته که فواید اشاره گر رو داره ولی خطراتش رو نداره. در ساخت این کلاس‌ها از اشاره گر استفاده میشه.

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

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

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

----------

