Upload
nesibe-yalcin
View
26
Download
0
Embed Size (px)
Citation preview
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.
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("%p\n",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 45 p
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!