1 / 31

C++ Pointers and Strings

C++ Pointers and Strings. MEMORY. Address. 0 1 2 3 4 5 81345 81346 81347. ساختار حافظه. حافظه دنباله ای از بایت های پشت سرهم است که هر کدام یک آدرس دارند. Int x=67;. با موقعیت فیزیکی x در حافظه کاری نداشتیم. چطور به آدرس متغیرها دسترسی داشته باشیم؟. 67. x. MEMORY. Address. 0

Télécharger la présentation

C++ Pointers and Strings

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++ Pointers and Strings

  2. MEMORY Address 0 1 2 3 4 5 81345 81346 81347 ... ... ساختار حافظه حافظه دنباله ای از بایت های پشت سرهم است که هر کدام یک آدرس دارند. Int x=67; با موقعیت فیزیکی x در حافظه کاری نداشتیم چطور به آدرس متغیرها دسترسی داشته باشیم؟ 67 x

  3. MEMORY Address 0 1 2 3 4 5 81345 81346 81347 ... ... & (عملگر ارجاع) برای دسترسی به آدرس یک نقطه از حافظه از عملگر & (عملگر ارجاع) استفاده می کنیم ( &x يعني آدرس x) Int x=67; int main() { int x=67; cout<<&x; // output is 81345 Return 0; } 67 x

  4. MEMORY Address 0 1 2 3 4 5 81345 81346 81347 ... ... (Pointers)اشاره گرها اشاره گرها متغیرهایی هستند که برای ذخیره آدرس یک نقطه از حافظه استفاده می شوند. نوع * نام اشاره گر ; x 123 int x; int * ptr; x = 123; ptr = &x; ptr 3

  5. MEMORY ... Address 81345 81346 81347 81348 81349 ... (Pointers)اشاره گرها منظور از نوع اشاره گر در واقع نوع متغیری است که قرار است آدرس آن درون اشاره گر قرار بگیرد. ... m 3.14 نوع * نام اشاره گر ; 81346 ptr float m=3.14; float * p=&m; ...

  6. چطور از طریق اشاره گر به محتوای جایی که اشاره گر به آن اشاره می کند دسترسی داشته باشیم؟ • عملگر * دو کاربرد دارد • تعریف یک متغیر اشاره گر • دسترسی به محتوای جایی که اشاره گر به آن اشاره می کند. *ptr يعني مقدار x یا محتوای جایی که اشاره گر ptr به آن اشاره می کند. int x=1,y; int * ptr; ptr = &x; y = *ptr + 17; *ptr = *ptr + 1;

  7. Assigning a value to a dereferenced pointer اگر اشاره گر به جايي اشاره نکند، نمي توان به مقدار آن دسترسي داشت. int *ptr; *ptr=3; int x; int *ptr; ptr = &x; *ptr=3; ERROR!!! ptr doesn’t point to anything!!! this is fine ptr points to x

  8. مثال : خروجی برنامه زیر را تعیین کنید. int main() { int value1=5, value2=15; int * p1, * p2; p1=&value1; p2=&value2; *p1=10; *p2=*p1; p1=p2; *p1=20; cout<<“value1= “<<value1<<endl; cout<<“ and value2= “<<value2; return 0; }

  9. عملیات روی اشاره گرها: عملگر انتساب می توان از عملگر (=) برای مقداردهی و انتساب اشارگرها به یکدیگر استفاده کرد float f1,f2, *p1, *p2; . . . p1=&f1; . . . p2=p1; . .

  10. عملیات روی اشاره گرها: مقایسه می توان از عملگرهای رابطه ای برای مقایسه اشاره گرها درون شرطها و حلقه ها استفاده کرد. float f1,f2, *p1, *p2; p1=&f1; p2=&f2; . . if(p1==p2) {… } . . while(p2!=p1) {..} > >= < <= == !=

  11. عملیات روی اشاره گرها: عملگرهای محاسباتی می توان به اشاره گرها مقداری اضافه یا از آنها مقداری کم کرد. با اضافه کردن به اشاره گر به آن گفته ایم در حافظه پیشروی کند و با کم کردن از آن گفته ایم در حافظه به عقب برگردد. int x; char c; int * p=&x; Char * ch=&c; p تعداد بایت هایی که هر اشاره گر به ازای یک واحد افزایش یا کاهش پیشروی می کند بستگی به نوع اشاره گر دارد. p+1

  12. استفاده از توصیف کننده const همراه با اشاره گرها 1. اشاره گر غیر ثابت به داده غیر ثابت char * sptr; Char ch; sptr=&ch; *sptr=“change”; sptr++; 2. اشاره گر غیر ثابت به داده ثابت const int* ptr; int x=1; ptr=&x; *ptr=2; ptr++; ERROR!!!

  13. استفاده از توصیف کننده const همراه با اشاره گرها 3. اشاره گر ثابت به داده غیر ثابت int x,y; int * const ptr=&x; *ptr=7; ptr=&y; 4. اشاره گر ثابت به داده ثابت int x=5,y; const int * const ptr=&x; ptr=&y; *ptr=2; ERROR!!! ERROR!!! ERROR!!!

  14. اشاره گرها و آرایه ها نام آرایه ها، آدرس اولین خانه آرایه است. نام آرایه اشاره گری است که به اولین خانه از خانه های رزرو شده در حافظه اشاره می کند. array[0] array[1] array[2] array[3] array[4] *array *(array+1) *(array+2) *(array+3) *(array+4) int array[5]; 5*4=20 بایت در حافظه رزرو کن. آدرس اولین بایت آن را درون array بریز.

  15. مثال : خروجی برنامه زیر را تعیین کنید. 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 i=0;i<5;i++) Cout<<numbers[i]<<endl; Return 0; }

  16. اشاره گرها و فراخوانی توابع فراخوانی با مقدار : تغییرات درون تابع روی متغیر اصلی تاثیر نداشت. فراخوانی با ارجاع : تغییرات درون تابع روی مقدار اصلی تاثیری داشت. void swap(int &p,int &q); int main() { int a=2,b=3; cout<<a<<b; swap(a,b); cout<<a<<b; return 0; } void swap(int &p,int &q) { int temp=p; p=q; q==temp; } روش اول : استفاده از پارامترهای ارجاعی

  17. اشاره گرها و فراخوانی توابع void swap(int *p,int *q); int main() { int a=2,b=3; cout<<a<<b; swap(&a,&b); cout<<a<<b; return 0; } void swap(int *p,int *q) { int temp=*p; *p=*q; *q=temp; } روش دوم: استفاده از اشاره گرها

  18. Pointers and Arrays • اساسا، اسم آرايه يک اشاره گر const است. • مي توان از عملگر [] با يک اشاره گر استفاده کرد. int *x; int a[10]; a++; x = &a[2]; for (int i=0;i<3;i++) x[i]++; ERROR!!! Array’s name is const pointer!!! x is “the address of a[2] ” x[i] is the same as a[i+2]

  19. آرایه ها را نیز می توان از طریق اشاره گرها به توابع ارسال کرد void print_array(int a[], int len) { for (int i=0;i<len;i++) cout << a[i] << endl; } array version void print_array(int*a, intlen) { for (inti=0;i<len;i++) cout << *a++ << endl; یاcout << *(a+i)<< endl; یاcout << *a[i] << endl; } pointer version

  20. Pointer Parameters • اشاره گرها با مقدار به تابع فرستاده مي شوند (مقدار اشاره گر آدرسي است که به آن اشاره مي کند). • اگر آنچه که اشاره گر به آن اشاره مي کند را تغيير دهيم، برنامه صدا کننده تغييرات را مشاهده خواهد کرد. • اما اگر خود اشاره گر را تغيير دهيم، برنامه صدا کننده تغييرات را مشاهده نخواهد کرد چون ما فقط يک کپي از اشاره گر را دريافت کرده ايم.

  21. C++ strings • رشته آرايه اي از کاراکترها است که با کاراکتر null(‘\0’)خاتمه پيدا کرده است. • يعني در آخر آرايه کاراکتري وجود دارد که مقدار آن صفر است. char name[5]; char name[]={‘c’,’+’,’+’,’\0’}; char name[]=“c++”; name

  22. C++ strings از تمامی ویژگی های آرایه ها می توان در مورد رشته ها نیز استفاده کرد char mystring[20]; mystring[5]=‘F’; برای چاپ رشته می توان از جریان خروجی cout به همراه نام رشته استفاده کرد و نیازی به استفاده از حلقه for نیست. char mystring[20]=“university”; cout<<mystring;

  23. C++ strings برای مقدار دهی به رشته ها می توان از جریان ورودی cin استفاده کرد. char mystring[20]; cin>>mystring; اشکال دستور cin این است که نمی توان از آن برای دریافت رشته هایی که حاوی کاراکتر فاصله هستند استفاده کرد زیرا cin این کاراکتر را کاراکتر پایانی فرض می کند.

  24. C++ strings برای دریافت رشته هایی که حاوی کاراکتر فاصله هستند از دستورات زیر استفاده می کنیم. cin.getline( نام متغیر رشته ای , حداکثر طول رشته , کاراکتر پایانی); cin.get( نام متغیر رشته ای , حداکثر طول رشته , کاراکتر پایانی); cin.getline(mystring,19,’\n’);

  25. C++ strings and Pointers اغلب، اشاره گرها را همراه با رشته ها استفاده مي کنند. يعني آرايه را بصورت اشاره گر تعريف مي کنند. char *name= “C++”; zero (null) name

  26. String Manipulation Functions • C++ يک کتابخانه (cstring) براي کار کردن با رشته ها دارد که حاوي توابع مفيد زيادي است. char * strcpy(char *dst, const char *src) char * strcat(char *dst, const char *src) lots more!

  27. String Example - Count the chars int count_string( char *s) { int n=0; while (*s) { n++; s++; } return(n); } while the thing pointed to by s is not null increment count set s to point to the next char

  28. Another way int count_string( char *s) { char *ptr = s; while (*ptr) { ptr++; } return(ptr - s); } pointer arithmetic!

  29. تخصیص پویای حافظه • وقتی یک آرایه تعریف می کردیم باید قبل از اجرا و در زمان کامپایل مشخص می شد. • این مسئله گاهی باعث به هدر رفتن حافظه می شد. • اشاره گرها این امکان را به ما می دهند که در زمان اجرا و به صورت پویا در حافظه فضا رزرو کنیم.

  30. تخصیص پویای حافظه • برای تخصیص پویای حافظه از دستورات new و delete استفاده می کنیم. ptr int * ptr; ptr=new int; یا ptr=new int[10]; . . . delete ptr; float* p; p=new float[20]; . . . delete p; دستور new فضای کافی برای ذخیره 10 عدد صحیح را رزرو کرده و آدرس اولین بایت آن را در اشاره گر ptr قرار می دهد.

  31. References • Main Ref. : Dr. BagMohammadi ‘s presentations on C++, Ilam University. • C++ How to Program, Deitel&Deitel. • Internet.

More Related