4. hafta pointers (göstericiler ) · 2020-03-06 · 4 pointers - göstericiler ―* içerik...

24
4. Hafta Pointers (Göstericiler ) Dr. Öğr. Üyesi Nesibe YALÇIN https://nesibeyalcin.wordpress.com/bsm104/ BARTIN ÜNİVERSİTESİ MÜHENDİSLİK, MİMARLIK VE TASARIM FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Upload: others

Post on 20-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

4. Hafta – Pointers (Göstericiler )

Dr. Öğr. Üyesi Nesibe YALÇIN

https://nesibeyalcin.wordpress.com/bsm104/

BARTIN ÜNİVERSİTESİ

MÜHENDİSLİK, MİMARLIK VE TASARIM FAKÜLTESİ

BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Page 2: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

2

Pointers - Göstericiler ― Her değişkenin tipi, adı, değeri ve bellekte bulunduğu bir adresi vardır.

Page 3: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

3

Pointers - Göstericiler ― Adres, o değişkenin bellekteki konumunu gösteren bilgidir.

― Bir değişkenin bellek üzerindeki adresini öğrenmek için "& adres operatörü"nden yararlanılır.

― Pointer, adres bilgisini tutmaya yarayan değişken türüdür.

― Gösterici, işaretçi ve gösterge de denir.

Page 4: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

4

Pointers - Göstericiler ― * içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir.

― Hafızaya direkt erişim yapabilmeyi sağlar.

― Pointerler, doğrudan adresleri gösterdiği için, programın çalışma hızını artırır.

― Dinamik adres yönetimini sağlar.

― Karmaşık veri yapıları ile işlem yapmayı kolaylaştırır.

Page 5: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

5

Pointers - Göstericiler

Page 6: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

6

Pointers - Göstericiler

― int a=4; ― int *ptr= &a; // int *p; p=&a;

― printf(“adres: %p”, &a); // a’nın adresi

― //ptr’ nin gösterdiği adres ― printf(“adres: %p”,ptr); adres: 00000000001BFE34 ― printf(“adres: %x”,ptr); adres: 1bfe34

― //ptr’ nin gösterdiği adresteki değer ― printf(“%d”,*ptr);

Page 7: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

7

Pointers - Göstericiler

― float x=4.2; ― float *ptr= &x;

― int b[]={4, 12, -3, 0, 14, 7, 11}; ― int *p= b;

― char harf=‘B’; ― char *a=&harf;

NOT: Pointerlara, hangi veri türünü gösteriyor ise o veri türündeki değişkenin ya da dizinin adresi atanabilir.

Page 8: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

8

Pointers - Göstericiler

― short f[]={2, -5, 4, -2, 3}; short *z=f; short *z=&f; //hatalı short *z=&f[0];

― double* p; *p = 8.2; //tehlikeli !!

― float x=4.2; char *ptr; ptr= &x; //hatalı

― double z=-5.72; double *n=&z; *n=3.8;

Page 9: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

9

Pointers - Göstericiler

― Pointer işlemlerinde * ve & operatörlerini birlikte kullanmak mümkündür. int *p=*&a;

― Ancak bu operatörler birbirinin tersi işlemleri yerine getirdiği için, birbirlerini götürmeleri söz konusudur.

#include <stdio.h>

int main(){

int a[]={2, 4, -1, 0, 13};

int *p=*&a;

printf("%p\n",p);

printf("%d",*p); }

Page 10: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

10

Pointers - Göstericiler

#include <stdio.h>

int main(){

int *p=(int *)0x0062fe30;

printf("%p\n",p);

printf("%d",*p); }

Page 11: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

11

Pointers - Göstericiler

#include <stdio.h>

int main(){

char *p=(char *)0x0062fe30;

printf("%p\n",p);

printf("%c",*p); }

Page 12: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

12

Pointer Aritmetiği

― Bir adres bilgisini artırarak ya da azaltarak, önceki veya sonraki adreslere ulaşabiliriz. ― int a;

a tamsayı değişkeninin adresi, &a: 0x0026FCC8 &a+1 : 0x0026FCCC &a-1 : 0x0026FCC4

― &a+1 0x0026FCC8 +1*sizeof(int) = 0x0026FCCC &a-1 0x0026FCC8 - 1*sizeof(int) = 0x0026FCC4

― Yanlış kullanımlar: &a++, &++a, ++&a

Page 13: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

13

Pointer Aritmetiği

― int *p=&a; p: 0x0026FCC8 p++; //p=p+1*sizeof(int) - 0x0026FCCC p--; //p=p-1*sizeof(int) - 0x0026FCC4

― p+1 p=p+1*sizeof(int) - 0x0026FCCC p+2 p=p+2*sizeof(int) - 0x0026FCD0

― *p+1 a+1 ― *p++ *(p++) = *(p+1)

― *p++ ≠ *p+1

Page 14: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

14

Pointer Aritmetiği

― short *m; m++; //m=m+1*sizeof(short) m--; //m=m-1*sizeof(short)

― char *x; x++; //x=x+1*sizeof(char) x--; //x=x-1*sizeof(char)

― double*t; t++; //t=t+1*sizeof(double) t--; //t=t-1*sizeof(double)

Page 15: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

15

Pointer Aritmetiği

― int a=45; int *p=&a;

― printf("%d \n",*p++); Ekrana 45 basar. //*(ptr++) p: 0x0062FE3Colur. ― printf("%d \n",(*p)++); Ekrana 45 basar. p: 0x0062FE38 ― printf("%d \n", ++*p); Ekrana 46 basar. p: 0x0062FE38

Adres Veri

0x0062FE38 45 p

Page 16: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

16

Pointer Aritmetiği

― printf("%d \n", --*p); Ekrana 44 basar. p: 0x0062FE38

― printf("%d \n",*p--); Ekrana 45 basar. //*(ptr--) p: 0x 0x0062FE34 ― printf("%d \n",*p-1); Ekrana 44 basar. p: 0x 0x0062FE38

Adres Veri

0x0062FE38 45 p

Page 17: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

17

Pointer Aritmetiği

Page 18: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

18

Pointer ve Diziler

― char a[]="C dili"; char *p=a;

a[0]=‘C’; a[1]=‘ ’; a[2]=‘d’; a[3]=‘i’; a[4]=‘l’; a[5]=‘i’; a[6]=‘\0’;

0 1 2 3 4 5 6

C d i l i \0

adres Veri

0x00

0x01 67 ‘C’

0x02 32 ‘ ’

0x03 100 ‘d’

0x04 105 ‘i’

0x05 108 ‘l’

0x06 105 ‘i’

0x07 0 ‘\0’

0x08

0x09

0x10

0x14

*p *(p+1) *(p+2) *(p+3) *(p+4) *(p+5) *(p+6)

Dizinin başlangıç adresi

Page 19: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

19

Uygulama -1 #include <stdio.h>

int main(){

char *a;

char str[11]= "kara kalem";

a=str;

//dizi elemanlarını yazdırma

for(int i=0;i<10;i++)

printf("%c",str[i]);

printf("\n");

//dizi elemanlarını yazdırma

for(int i=0;i<10;i++)

printf("%c",*(str+i)); }

Page 20: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

20

Uygulama -2 #include <stdio.h>

int main(){

int dizi[]={10, 5, -5, 4, 2};

int *a = &dizi[2];

printf("%d \n", *a+*a);

printf("adres %p \n",a);

printf("%d \n", --*a);

printf("adres %p \n",a);

printf("%d \n", *++a);

printf("adres %p \n",a);

printf("%d \n", *a++);

printf("adres %p \n",a); }

Page 21: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

21

Uygulama -3 #include <stdio.h>

int main(){

int numbers[]={5,10,15,20,25};

int *ptr=numbers;

int i,sum=0;

for(i=0;i<sizeof(numbers)/sizeof(int);i++){

printf("%d.number: %d\n",i+1,*(ptr+i));

sum+= *(ptr+i);

}

printf("Sum of numbers: %d",sum); }

Page 22: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

22

Pointer Dönüşümü

― int sayi= 67; char *p = (char*) &sayi; printf(“%c”,*p); Ekran çıktısı: C (ASCII değeri) printf(“%d”,*p); Ekran çıktısı: 67

― char k=‘?’; int *y = (int*) &k; printf(“%d”,*y); Ekran çıktısı: 63 (ASCII değeri) printf(“%c”,*y); Ekran çıktısı: ‘?’

Page 23: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

23

Null Pointer

― Bir pointerın bellekte herhangi bir adresi göstermemesi veya önceden göstermiş olduğu adresin iptal edilmesi istenirse NULL sabiti kullanılır.

― int *ptr=NULL; // int *ptr=0;

Page 24: 4. Hafta Pointers (Göstericiler ) · 2020-03-06 · 4 Pointers - Göstericiler ―* içerik operatörü, önündeki değişkenin bir pointer (gösterici) olduğunu bildirir. ―Hafızaya

24

Dikkat !!!

― Pointerlara ilk değeri atanmalıdır. • Pointerlarda daima legal bir adres veya NULL değeri bulunmalıdır.

― Pointerlar arasında dönüşüm yapılırken dikkat edilmelidir.

― İlk değeri atanmamış veya 0 olarak atanmış pointerların gösterdiği hücrelere erişilmeye çalışıldığında hata ile karşılaşılabilir!