اشاره گرها:
اشارهگر (pointer): متغیری است که آدرس یک متغیر دیگر را نگه می دارد. و شکل کلی تعریف اشاره گر به صورت زیر است:
نوع داده* نام متغیر;
int* p;
p متغیری است که آدرس یک int را نگه می دارد.
float* ptr;
ptr توانایی نگهداری آدرس یک متغیر از نوع float را دارد.
عملگر & آدرس یک متغیر را میدهد.
int x=23;
درون حافظه اصلی، حافظه ای به اندازه یک integer در اختیار x قرار میگیرد و درون آن حافظه 23 نوشته می شود. حافظه ای که به x اختصاص داده شده، آدرسی دارد.
int* p;
p متغیری است که میتواند آدرس یک int را نگه دارد.
p=&x;
درون p آدرس x قرار گرفته (p به x اشاره میکند.)
cout<<p;
آدرس x چاپ می شود.
عملگر * محتوای یک آدرس را به ما می دهد.
Cout<<*p;
با مراجعه به آدرس نوشته شده در P به محتوای آن دسترسی پیدا می کنیم.
int x=23;
int* p;// p mitavand adrese 1 int ra negah darad
p=&x; //
cout<<"\n adrese X="<<p; è آدرس ایکس
cout<<"\n *p="<<*p; è23
خروجی کد زیر چند است؟
float f1=12.25;
float* ptr;
ptr=&f1;
cout<<f1;è 12.25
cout<<ptr;è f1 آدرس
cout<<*ptr;è12.25
f1++;//f1=13.25
cout<<*ptr;è 13.25
cout<<f1;è13.25
*ptr+=10;
cout<<f1;è 23.25
خروجی کدهای زیر چیست؟
int x=23;
int* p;// p mitavand adrese 1 int ra negah darad
p=&x;
cout<<"\n adrese X="<<p;
cout<<"\n *p="<<*p;//23
x++;//x=24
cout<<"\nafter x++ *p="<<*p;// 24
(*p)++;
cout<<"\nX="<<x;//X=25
خروجی کدهای زیر چیست؟
int A[5]={12,15,16,10,7};
12 |
15 |
16 |
10 |
7 |
int* p=&A[0];
cout<<*p;è12
p++;
cout<<*p;è15
نام آرایه بدون اندیس به معنای آدرس اولین عنصر آرایه است. یعنی به جای خط p=&A[0] میتوان نوشت p=A
خروجی کد زیر چیست؟
char S1[20];
cout<<”\nenter 1 string:”;
gets(S1);
char* p;
p=S1;// p=&S1[0];
p از نوع اشاره گر به کاراکتر است و به حرف اول S1 اشاره می کند (آدرس حرف اول s1 را نگه میدارد.)
for(;*p;p++)
cout<<*p;
s |
a |
l |
a |
m |
\0 |
|
|
p
جواب: همه حروف رشته ورودی را چاپ میکند.
سوال: تابعی بنویسید که با دریافت آدرس حرف اول یک رشته تعداد ارقام موجود در رشته را برگرداند.
int countdigit(char* p)
{
int count=0;
for(;*p;p++)
if(*p<=’9’) && (*p>=’0’) count++;
return count;
}
نحوه استفاده از تابع فوق
Void main()
{
char s[30];
cout<<"\nenter your name:";
gets(s);
cout<<”\n tedade argham moujood dar s=”<<countdigit(s);
و یا مینویسیم:
cout<<”\n tedade argham moujood dar s=”<<countdigit(&s[0]);
کار کد زیر چیست؟
void func1(char* p)
{
for (;*p;p++)
(*p)++;
}
void main(){
char s1[30];
cout<<”\nenter 1 string:”;
gets(s1);
func1(s1);
cout<<”\nS1=”<<s1;
}
اگر برای ورودی کد فوق عبارت abc23 وارد شود در خروجی bcd34 چاپ میشود.
به کمک دستور new می توان به تعداد مد نظر حافظه را از سیستم بگیریم.
int x;
cin>>x;
int A[x];
کد فوق به علت متغیر بودن x خطا دارد.
int* A;
int x;
cin>>x;
A=new int[x];
در کد فوق تعداد عناصر آرایه توسط کاربر مشخص میشود. دستور new به کمک اشاره گر به تعداد دلخواه حافظه در اختیار برنامه قرار می دهد.
خروجی کد زیر چیست؟
int A[5]={2,3,4,1,5};
int* p=A;
cout<<A[*p+2];//cout<<A[2+2];è5
cout<<*(p+*p);//cout<<*(p+2);è4
مثال: تابعی بنویسید که دو اشارهگر به کاراکتر را دریافت کرده و بررسی کند که آیا رشته متناظر با اشاره گر دوم در رشته متناظر با اشاره گر اول وجود دارد یا خیر
#include <iostream.h>
#include <string.h>
#include <stdio.h>
int instr(char* p1,char* p2)
{mohamadreza
reza
int k=0;
for(;*p1;p1++)
while (*p1==*p2 && *p2 && *p1)
{
p1++;
p2++;
k++;
if (k==strlen(p2))return 1;
}
return 0;
}
void main()
{
char S1[30],S2[30];
gets(S1);
gets(S2);
cout<<instr(S1,S2);
}
تابع strcat را با نام newstrcat شبیه سازی کنید
Char s1[30]=”ali”;
Char s2[30]=”reza”;
Strcat(s1,s2);
Cout<<s1;èalireza
تابعی بنویسید که اشاره گر به کاراکتر را دریافت و تمامی حروف بزرگ آن رشته را کوچک کند.
جواب هر دو سوال فوق
void Lcase(char* p)
{
for(;*p;p++)
if(*p>='A' && *p<='Z')
*p+=32;
}
void newstrcat(char* p1,char* p2)
{
int k=strlen(p1);
for(;*p2;p2++,k++)
*(p1+k)=*p2;
*(p1+k)='\0';
}
void main(){
char s1[50];
cout<<"\nenter 1 string:";
gets(s1);
Lcase( s1);
cout<<"\n"<<s1;
char s2[50];
cout<<"\nenter 1 string:";
gets(s2);
newstrcat(s1,s2);
cout<<s1;
دانلود فایل مثال ها
(*.cpp)