4. hafta pointers (göstericiler ) · 2020-03-06 · 4 pointers - göstericiler ―* içerik...
TRANSCRIPT
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Ü
2
Pointers - Göstericiler ― Her değişkenin tipi, adı, değeri ve bellekte bulunduğu bir adresi vardır.
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.
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.
5
Pointers - Göstericiler
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);
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.
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;
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); }
10
Pointers - Göstericiler
#include <stdio.h>
int main(){
int *p=(int *)0x0062fe30;
printf("%p\n",p);
printf("%d",*p); }
11
Pointers - Göstericiler
#include <stdio.h>
int main(){
char *p=(char *)0x0062fe30;
printf("%p\n",p);
printf("%c",*p); }
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
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
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)
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
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
17
Pointer Aritmetiği
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
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)); }
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); }
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); }
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ı: ‘?’
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;
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!