X
تبلیغات
رایتل

برنامه نویسان کامپیوتر

این وب سایت به منظور استفاده دانشجویان دانشگاه شهید بهشتی کرج ایجاد شده

جلسه نهم

اشاره گرها:

اشاره­گر (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)