ݺߣ

ݺߣShare a Scribd company logo
Göstericiler
Programlama dilleri 1
- 5. hafta -
Araş. Gör. Nesibe YALÇIN
BİLECİK ŞEYH EDEBALİ ÜNİVERSİTESİ
MÜHENDİSLİK FAKÜLTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
2
Göstericiler
― Her değişkenin tipi, adı, değeri ve bellekte bulunduğu
bir adresi vardır.
― Adres, o değişkenin bellekteki konumunu gösteren
bilgidir.
― Bir değişkenin bellek üzerindeki adresini öğrenmek
için "&" operatöründen yararlanılır. & adres operatörü,
önünde bulunan değişkenin adresini bildirir.
3
Göstericiler
― Gösterici ise bu adres bilgisini tutmaya yarayan
değişken türüdür.
― Pointer, işaretçi ve gösterge de denir.
― * içerik operatörü de önündeki değişkenin bir
gösterici (pointer) olduğunu bildirir.
― Göstericiler sayesinde hafızaya direkt erişim
yapabilmekteyiz.
4
Göstericiler
― Gösterici türü Gösterici sembolü Değişkenin adı
5
Göstericiler
― int sayi=4;
― int *p= &sayi;
― *p=3;
― int sayilar={4, 12, -3, 0, 14, 7, 11};
― *p= sayilar;
― p bir göstericidir ve kendisine ancak bir tamsayının/tam
sayı dizisinin başlangıç adresi atanabilir.
6
Göstericiler
― float x=4.2;
― float *gosterici= &x;
― char harf=‘B’;
― char *a=&harf;
― short f[]={2, -5, 4, -2, 3};
― short *z=f;
― short *z=&f; //hatalı
― double* p;
*p = 8.2; //tehlikeli !!
float x=4.2;
char *gosterici;
gosterici = &x; //hatalı
double z=-5.72;
double *n=&z;
*n=3.8;
7
Göstericiler
― int sayi=4;
― int *gosterici= &sayi;
― //göstericinin gösterdiği adresteki değer
― printf(“%d”,*gosterici);
― printf(“adres: %p”,&sayi);
― //göstericinin tuttuğu adres
― printf(“adres: %p”,gosterici);  adres: 001BFE34
― printf(“adres: %x”,gosterici);  adres: 1bfe34
8
Göstericiler
― Gösterici 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>
#include <conio.h>
void main()
{
int a[]={2, 4, -1, 0, 13};
int *p=*&a;
printf("%pn",p);
printf("%d",*p);
getch (); }
9
Gösterici 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: 0026FCC8
&a+1 : 0026FCCC
&a-1 : 0026FCC4
― Yanlış kullanımlar: &a++, &++a, ++&a
― int *p=&a;  p: 0026FCC8
― p++; //p=p+1*sizeof(int) - 0026FCCC
― p--; //p=p-1*sizeof(int) - 0026FCC4
10
Gösterici Aritmetiği
― short *m;
― m++; //m=m+1*sizeof(short)  m++ ≠ m+1
― 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)
11
Gösterici Aritmetiği
― int a=45;
― int *p=&a;
― printf("%d n",*p++); Ekrana 45 basar. //*(ptr++)
p: 0x08 olur.
― printf("%d n",(*p)++); Ekrana 46 basar.
p: 0x04
― printf("%d n", ++*p); Ekrana 46 basar.
p: 0x04
― printf("%d n", --*p); Ekrana 44 basar.
p: 0x04
― printf("%d n",*p--); Ekrana 45 basar. //*(ptr--)
p: 0x00 olur.
Adres Veri
0x04 45p
12
Gösterici Aritmetiği
13
Gösterici 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
14
Uygulama Örnekleri
#include <stdio.h>
#include <conio.h>
void main(){
char *a;
char str[11]= "kara kalem";
a=str;
for(int i=0;i<10;i++) //dizi elemanlarını yazdırma
printf("%c",str[i]);
printf("n");
for(int i=0;i<10;i++) //dizi elemanlarını yazdırma
printf("%c",*(str+i));
getch();
}
15
Uygulama Örnekleri
#include <stdio.h>
#include <conio.h>
void main(){
int dizi[]={10, 5, -5, 4, 2};
int *a = &dizi[2];
printf("%d ", *a+*a);
printf("adres %p n",a);
printf("%d ", --*a);
printf("adres %p n",a);
printf("%d ", *++a);
printf("adres %p n",a);
printf("%d ", *a++);
printf("adres %p n",a);
getch(); }
16
Gösterici Dönüşümü
― int sayi= 67;
― char *x = (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ı: ‘?’
17
Null Göstericiler
― Bir göstericinin 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;
18
Dikkat !!!
― Göstericilere ilk değeri atanmalıdır.
• Göstericilerde daima legal bir adres veya NULL değeri
bulunmalıdır.
― Göstericiler arasında dönüşüm yapılırken dikkat
edilmelidir.
― İlk değeri atanmamış veya 0 olarak atanmış göstericilerin
gösterdiği hücrelere erişilmeye çalışıldığında hata ile
karşılaşılabilir!

More Related Content

Göstericiler - Pointers

  • 1. Göstericiler Programlama dilleri 1 - 5. hafta - Araş. Gör. Nesibe YALÇIN BİLECİK ŞEYH EDEBALİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
  • 2. 2 Göstericiler ― Her değişkenin tipi, adı, değeri ve bellekte bulunduğu bir adresi vardır. ― Adres, o değişkenin bellekteki konumunu gösteren bilgidir. ― Bir değişkenin bellek üzerindeki adresini öğrenmek için "&" operatöründen yararlanılır. & adres operatörü, önünde bulunan değişkenin adresini bildirir.
  • 3. 3 Göstericiler ― Gösterici ise bu adres bilgisini tutmaya yarayan değişken türüdür. ― Pointer, işaretçi ve gösterge de denir. ― * içerik operatörü de önündeki değişkenin bir gösterici (pointer) olduğunu bildirir. ― Göstericiler sayesinde hafızaya direkt erişim yapabilmekteyiz.
  • 4. 4 Göstericiler ― Gösterici türü Gösterici sembolü Değişkenin adı
  • 5. 5 Göstericiler ― int sayi=4; ― int *p= &sayi; ― *p=3; ― int sayilar={4, 12, -3, 0, 14, 7, 11}; ― *p= sayilar; ― p bir göstericidir ve kendisine ancak bir tamsayının/tam sayı dizisinin başlangıç adresi atanabilir.
  • 6. 6 Göstericiler ― float x=4.2; ― float *gosterici= &x; ― char harf=‘B’; ― char *a=&harf; ― short f[]={2, -5, 4, -2, 3}; ― short *z=f; ― short *z=&f; //hatalı ― double* p; *p = 8.2; //tehlikeli !! float x=4.2; char *gosterici; gosterici = &x; //hatalı double z=-5.72; double *n=&z; *n=3.8;
  • 7. 7 Göstericiler ― int sayi=4; ― int *gosterici= &sayi; ― //göstericinin gösterdiği adresteki değer ― printf(“%d”,*gosterici); ― printf(“adres: %p”,&sayi); ― //göstericinin tuttuğu adres ― printf(“adres: %p”,gosterici);  adres: 001BFE34 ― printf(“adres: %x”,gosterici);  adres: 1bfe34
  • 8. 8 Göstericiler ― Gösterici 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> #include <conio.h> void main() { int a[]={2, 4, -1, 0, 13}; int *p=*&a; printf("%pn",p); printf("%d",*p); getch (); }
  • 9. 9 Gösterici 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: 0026FCC8 &a+1 : 0026FCCC &a-1 : 0026FCC4 ― Yanlış kullanımlar: &a++, &++a, ++&a ― int *p=&a;  p: 0026FCC8 ― p++; //p=p+1*sizeof(int) - 0026FCCC ― p--; //p=p-1*sizeof(int) - 0026FCC4
  • 10. 10 Gösterici Aritmetiği ― short *m; ― m++; //m=m+1*sizeof(short)  m++ ≠ m+1 ― 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)
  • 11. 11 Gösterici Aritmetiği ― int a=45; ― int *p=&a; ― printf("%d n",*p++); Ekrana 45 basar. //*(ptr++) p: 0x08 olur. ― printf("%d n",(*p)++); Ekrana 46 basar. p: 0x04 ― printf("%d n", ++*p); Ekrana 46 basar. p: 0x04 ― printf("%d n", --*p); Ekrana 44 basar. p: 0x04 ― printf("%d n",*p--); Ekrana 45 basar. //*(ptr--) p: 0x00 olur. Adres Veri 0x04 45p
  • 13. 13 Gösterici 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
  • 14. 14 Uygulama Örnekleri #include <stdio.h> #include <conio.h> void main(){ char *a; char str[11]= "kara kalem"; a=str; for(int i=0;i<10;i++) //dizi elemanlarını yazdırma printf("%c",str[i]); printf("n"); for(int i=0;i<10;i++) //dizi elemanlarını yazdırma printf("%c",*(str+i)); getch(); }
  • 15. 15 Uygulama Örnekleri #include <stdio.h> #include <conio.h> void main(){ int dizi[]={10, 5, -5, 4, 2}; int *a = &dizi[2]; printf("%d ", *a+*a); printf("adres %p n",a); printf("%d ", --*a); printf("adres %p n",a); printf("%d ", *++a); printf("adres %p n",a); printf("%d ", *a++); printf("adres %p n",a); getch(); }
  • 16. 16 Gösterici Dönüşümü ― int sayi= 67; ― char *x = (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ı: ‘?’
  • 17. 17 Null Göstericiler ― Bir göstericinin 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;
  • 18. 18 Dikkat !!! ― Göstericilere ilk değeri atanmalıdır. • Göstericilerde daima legal bir adres veya NULL değeri bulunmalıdır. ― Göstericiler arasında dönüşüm yapılırken dikkat edilmelidir. ― İlk değeri atanmamış veya 0 olarak atanmış göstericilerin gösterdiği hücrelere erişilmeye çalışıldığında hata ile karşılaşılabilir!