Programlama Dilleri 1 Ders 5: Göstericiler
Değişkenlerin adresleri Bellekteki her değişkenin bir adresi ve bir de taşıdığı değeri vardır. int x=3; DEĞİŞKEN BELLEK ADRES 0 (0000) 1 2 3 4...... 65533 (FFFD) x 3 65534 (FFFE) 65535 (FFFF) Programlama Dilleri 1 2
Değişkenlerin adresleri char ch; int b; sizeof(ch) veya sizeof(char) sizeof(b) veya sizeof(int) Programlama Dilleri 1 3
Değişkenlerin adresleri 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. Programlama Dilleri 1 4
Göstericiler * içerik operatörü de önündeki değişkenin bir gösterici (pointer) olduğunu bildirir. tip * değişken_adı; int *p; Bu ifade, tam sayı türündeki bir p göstericisini tanımlamaktadır. char *cptr1,*cptr2; float *naber; Programlama Dilleri 1 5
Göstericiler Bildirimi yapılmış bir gösterici, herhangi bir şey ifade etmez. Bu göstericinin kullanılabilmesi için, söz konusu göstericiye bir başka değişkenin adresini yerleştirmek gerekmektedir. Programlama Dilleri 1 6
Göstericiler int *p; int y; p=&y; p bir göstericidir ve kendisine ancak bir tamsayının adresi atanabilir. char *cptr1; float abc; cptr1 = &abc; //HATA!!! Programlama Dilleri 1 7
Göstericiler Adres bilgilerinin görüntülenmesi için printf( ) deyimi içinde biçimlendirme ifadesi olarak %p kullanmak gerekmektedir. Adresin onaltılık (hexadecimal) düzende görüntülenmesi isteniliyorsa %x tanımı kullanılır. Programlama Dilleri 1 8
Örnek-1 #include<stdio.h> #include<conio.h> int main( ) { int x=200; printf("değişkenin değeri:%d\n",x); printf("değişkenin bellek adresi:%p\n",&x); getch(); return 0; } Programlama Dilleri 1 9
Örnek-2 #include<stdio.h> #include<conio.h> int main( ) { int a,b; double c; char d; printf("a degiskeninin adresi:%p\n",&a); printf("b degiskeninin adresi:%p\n",&b); printf("c degiskeninin adresi:%p\n",&c); printf("d degiskeninin adresi:%p\n",&d); getch(); return 0; } Programlama Dilleri 1 10
Null ve Void 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; void göstericiler yalnızca adres saklamak için kullanılır. void *adr; İşaret ve Sistemler 11
Adreslerle işlemler Bir adres bilgisini artırarak ya da azaltarak, önceki veya sonraki adreslere ulaşabiliriz. a tamsayı değişkeninin adresi &a: 0026FCC8 &a+1 : 0026FCCC &a-1 : 0026FCC4 a char değişkeninin adresi &a: 0026FCC8 &a+1 : 0026FCC9 &a-1 : 0026FCC7 Yanlış kullanımlar: &a++, &++a, ++&a Programlama Dilleri 1 12
Gösterici aritmetiği Bir göstericinin içerdiği adresin bir sonrasını ya da bir öncesini öğrenmek için, göstericinin artırılması ya da eksiltilmesi yeterlidir. ++*p; *++p; *p++; Programlama Dilleri 1 13
Örnek-3 #include<stdio.h> #include<conio.h> int main( ) { double z=3.3; double *p=&z; printf("degeri=%4.1f, adresi :%p\n",*p,p); p++; printf("degeri=%4.1f, adresi:%p\n",*p,p); p++; printf("degeri=%4.1f, adresi:%p\n",*p,p); getch(); return 0; } Programlama Dilleri 1 14
& ve * operatörleri Gösterici işlemlerinde * ve & operatörlerini birlikte kullanmak mümkündür. Ancak bu operatörler birbirinin tersi işlemleri yerine getirdiği için, birbirlerini götürmeleri söz konusudur. Programlama Dilleri 1 15
Dizilerle göstericilerin birlikte kullanımı Bir a[ ] dizisinin temel adresi &a[0] biçiminde elde edilir. a[ ] dizisinin temel adresini bulmak için sadece a yazmak da yeterlidir. Bir dizi indissiz olarak yazıldığında, bu söz konusu dizinin temel adresini verecektir. Programlama Dilleri 1 16
Örnek-4 #include<stdio.h> #include<conio.h> #define boyut 5 int main( ) { int a[boyut]={2,7,0,3,9}; int *gosterici=a; for(int i=0;i<boyut;i++) printf("%d\n",*(gosterici+i)); getch(); return 0; } Programlama Dilleri 1 17
Örnek-5 #include<stdio.h> #include<conio.h> #define boyut 5 int main( ) { int a[boyut]={2,7,0,3,9}; int *gosterici=a; for(int i=0;i<boyut;i++) printf("%d\n",*gosterici++); getch(); return 0; } Programlama Dilleri 1 18
Örnek-6 #include<stdio.h> #include<conio.h> int main( ) { char a[ ]="Bilecik Seyh Edebali Universitesi"; char *gosterici=a; for(int i=0;gosterici[i]!= \0 ;i++) printf("%c",gosterici[i]); getch(); return 0; } Programlama Dilleri 1 19
Fonksiyon parametre değişkeni olarak göstericilerin kullanılması fonk_tipi fonk_adı(değişken_tipi * değişken_adı) {... } Bir fonksiyonun parametre değişkeni bir gösterici ise fonksiyon da aynı türden bir adres bilgisi ile çağırılmalıdır. Programlama Dilleri 1 20
Örnek-7 Örnek-8 #include<stdio.h> #include<conio.h> void fonksiyon(int *p) { *p = 20; } int main( ) { int a = 10; fonksiyon(&a); printf("%d\n", a); getch(); return 0; } #include<stdio.h> #include<conio.h> void degistir(int *p1, int *p2) { int gecici = *p1; *p1 = *p2; *p2 = gecici; } int main( ) { int a=10, b=20; degistir(&a, &b); printf(" a = %d\n b = %d\n",a,b); getch(); return 0; } Programlama Dilleri 1 21
Fonksiyon parametre değişkeni olarak göstericilerin kullanılması Fonksiyon göstericisi, fonksiyon adının saklandığı bellek adresini tutan bir göstericidir. Fonksiyon göstericileri sayesinde fonksiyonlar, başka fonksiyonlara parametre olarak aktarılabilmektedir. Fonksiyon bildirimi int fonk(int a) {.} Fonksiyon göstericisi bildirimi int* pfonk (int paramatre); İşaret ve Sistemler 22
Örnek-9 #include<stdio.h> #include<conio.h> int* fonk(int n){ int f=1; for(int i=1; i<n; i++) f*=i; return &f; } int main(){ int a=5; int *ptr=fonk(5); printf("degeri = %d\n", *ptr); printf("fonksiyonun adresi = %p\n", fonk(5)); getch(); return 0; } İşaret ve Sistemler 23
Köşeli Ayraç İşleci [ ] [ ] İşleci göstericilerde içerik gösterme anlamına gelmektedir. int a=9, *ptr=&a; ptr[0] = 11; // *ptr =11 ile aynıdır Dizilerdeki kullanım aslında bir gösterici kullanımıdır. char dizi[ ] = "Bilecik"; char *cptr = &dizi[3]; //cptr içeriği ne oldu? *cptr = dizi+3; printf("%c", cptr[0]); // *cptr Ekrana e basar printf("%c", cptr[-2]); // *(cptr-2) Ekrana i basar printf("%c", cptr[1]-2); // *(cptr+1)-2 Ekrana a basar printf("%c", *(cptr+1)+1); // cptr[1]+1 Ekrana d basar İşaret ve Sistemler 24