18
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Ü

Göstericiler - Pointers

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.

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("%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

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!