7. hafta pointer dizileri - · pdf file 2 pointer dizileri ―elemanları pointerlardan...

Click here to load reader

Post on 08-Aug-2020

0 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • 7. Hafta – Pointer Dizileri

    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Ü

    https://nesibeyalcin.wordpress.com/bsm104/ https://nesibeyalcin.wordpress.com/bsm104/ https://nesibeyalcin.wordpress.com/bsm104/

  • 2

    Pointer Dizileri

    ― Elemanları pointerlardan oluşan dizilere “pointer (gösterici) dizileri” (array of pointers) denir.

    ― Derleyici bir pointer dizisi tanımlaması ile karşılaşınca diğer dizilerde yaptığı gibi, bellekte belirtilen sayıda pointerı tutabilecek kadar ardışık yer tahsis eder.

    ― Değişken türü * Pointer dizisinin ismi [Eleman sayısı]; ― char *s[5];

    char * il[81]; int * stok[25]; float *maas [40];

  • 3

    Char Tipi Pointer Dizileri

    ― Uygulamalarda en sık görülen pointer dizileri, char türden olan pointer dizileridir.

    ― char türden bir pointer dizisinin her bir elemanı bir stringi (karakter dizisini) göstermektedir.

    ― char * isim[]={"ela","gökçe","burak","ömer"};

    ― char * kurslar[10] = {"Diksiyon","İngilizce", "Bilgisayar", "Bağlama","Gitar", "Tiyatro","Kişisel Gelişim","Fitness (bayanlar)", "Fitness (baylar)“, "Halk Oyunları",};

  • 4

    Char Tipi Pointer Dizileri

    ― Char tipi pointer dizilerin en çok kullanılma nedeni; program içinde sık kullanılacak yazıları her defasında yazmak yerine bir pointerdizisi içerisinde saklayarak gerektiğinde ulaşmaktır.

    char *hata[] = { "Bellek yetersiz", "Hatalı şifre", "Dosya bulunamadı", "Sürücü hazır değil", "Belirlenemeyen hata"};

  • 5

    Char Tipi Dizi ve Pointerlar

    #include

    #include

    #include

    int main(){

    char donem[]="Guz/Bahar Donemi";

    printf("%s -> adresi %p\n\n",donem,donem);

    char *ptr;

    ptr=donem;

    // char *ptr="Guz/Bahar Donemi";

    for(int i=0;i

  • 6

    Char Tipi Diziler

    ― char dersler[6][20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};

  • 7

    Char Tipi Diziler

    ― char dersler[6][20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};

    int main(){

    char dersler[6][20] = {"Programlama","Veritabani",

    "Elektronik","Matematik",

    "Fizik","Veri Yapilari"};

    for(int i=0;i

  • 8

    Char Tipi Diziler

    ― char dersler[6][20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};

    int main(){

    char dersler[6][20] = {"Programlama","Veritabani",

    "Elektronik","Matematik",

    "Fizik","Veri Yapilari"};

    for(int i=0;i

  • 9

    Char Tipi Pointer Dizileri

    ― char *dersler [20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};

  • 10

    Char Tipi Pointer Dizileri

    #include

    int main(){

    char *donem="Guz/Bahar Donemi";

    //char donem[]

    puts(donem);

    //char dersler[][20]

    char *dersler[20] = {"Programlama","Veritabani",

    "Elektronik","Matematik",

    "Fizik","Veri Yapilari"};

    for(int i=0;i

  • 11

    Pointer Dizileri

    #include

    #include

    int main()

    {

    const int boyut=7;

    int notlar[boyut]={25,40,5,95,50,65,45};

    int toplam=0;

    for (int i = 0; i < boyut; i++)

    toplam += notlar[i];

    float ort=(float)toplam/boyut;

    printf("Toplam=%d, Ortalama=%.2f",toplam,ort);

    getch();

    }

    adresi Dizi elemanı

    değeri

    0x04 notlar[0] 25

    0x08 notlar[1] 40

    0x0C notlar[2] 5

    0x10 notlar[3] 95

    0x14 notlar[4] 50

    0x18 notlar[5] 65

    0x1C notlar[6] 45

  • 12

    Pointer Dizileri

    #include

    #include

    int main(){

    const int boyut=7;

    int notlar[boyut]={25,40,5,95,50,65,45};

    int *ptr[boyut];

    for (int i = 0; i < boyut; i++){

    ptr[i]=&notlar[i];

    printf("%d ",*ptr[i]);

    }

    }

    ptr[0]

    ptr[1]

    ptr[2]

    ptr[3]

    ptr[4]

    ptr[5]

    ptr[6]

    adresi Dizi elemanı

    değeri

    0x04 notlar[0] 25

    0x08 notlar[1] 40

    0x0C notlar[2] 5

    0x10 notlar[3] 95

    0x14 notlar[4] 50

    0x18 notlar[5] 65

    0x1C notlar[6] 45

  • 13

    Pointer Dizileri

    ptr[0]

    ptr[1]

    ptr[2]

    ptr[3]

    ptr[4]

    ptr[5]

    ptr[6]

    adresi Dizi elemanı

    değeri

    0x04 notlar[0] 25

    0x08 notlar[1] 40

    0x0C notlar[2] 5

    0x10 notlar[3] 95

    0x14 notlar[4] 50

    0x18 notlar[5] 65

    0x1C notlar[6] 45

    #include

    #include

    float ortalama(int *dizi[],int eleman_sayi)

    {

    int toplam=0;

    for (int i = 0; i < eleman_sayi; i++)

    toplam+=*dizi[i];

    float ort=(float)toplam/eleman_sayi;

    return ort;

    }

    int main()

    {

    const int boyut=7;

    int notlar[boyut]={25,40,5,95,50,65,45};

    int *ptr[boyut];

    for (int i = 0; i < boyut; i++)

    ptr[i]=&notlar[i];

    printf("Ortalama=%.2f",ortalama(ptr,boyut));

    getch();

    }

  • 14

    Pointer Dizileri #include

    int main(){

    int dizi[] = {66, 6, 42, 11, 54}; //normal dizi

    int *ptr[5], i; //gösterici dizisi

    for (i=0; i

  • 15

    Pointer Gösteren Pointerlar

    ― Bir pointer, başka bir pointerın adresini gösterebilir:

    int x; int *p1; int **p2; x = 5; p1 = &x; p2 = &p1;

    NOT: int ** türünden olan bir pointer değişkene, int * türünden bir pointerın adresi atanır.

  • 16

    Pointer Gösteren Pointerlar #include

    int main(){

    int x;

    int *p1;

    int **p2;

    x = 5;

    p1 = &x;

    p2 = &p1;

    printf("x degiskeni:%d, adresi:%p\n",x,&x); //&x-->p1

    printf("p1 gostericisi:%p, adresi:%p\n",p1,&p1); //&p1-->p2

    printf("p2 gostericisi:%p, adresi:%p\n",p2,&p2);

    }

  • 17

    Pointer Gösteren Pointerlar

    *p1=24; **p2=10; *(*p2)=10;

  • 18

    Pointer Gösteren Pointerlar #include

    #include

    int main(){

    double x=-2.1;

    double y=0.34;

    double *p=NULL;

    double **p2=NULL;

    printf("x:%.2f, y:%.2f\n",x,y);

    p=&x;

    *p=2.8;

    printf("x:%.2f, y:%.2f\n",x,y);

    p2=&p;

    printf("x:%.2f, y:%.2f\n",x,y);

    *p2=&y;

    *p=20;

    printf("x:%.2f, y:%.2f\n",x,y);

    **p2=6.8;

    printf("x:%.2f, y:%.2f\n",x,y);

    getch(); }

    Ekran çıktısı ????

  • 19

    Pointer Gösteren Pointerlar

    #include

    #include

    #include

    #define N 6

    int main()

    {

    char *meyveler[N]={"muz","elma","cilek","karpuz","armut","uzum"};

    for(int i=0;i

  • 20

    Tanımlar Pointer Gösterimi Dizi Gösterimi Açıklama

    **ptr *dizi[] Bir pointer dizisi

    *ptr dizi[0] Dizideki ilk eleman, dizideki ilk pointerın adresi ya da bir string dizisi için ilk string

    *(ptr+0) dizi[0]

    *(ptr+i) dizi[i] Dizideki (i+1). eleman, dizideki ikinci pointerın adresi ya da bir string dizisi için ikinci string

    **ptr dizi[0][0] Dizideki ilk eleman, dizideki ilk pointerın ilk elemanı ya da dizideki ilk stringin ilk karakteri

    **(ptr+i) dizi[i][0] Dizinin i.satırdaki ilk elemanı, dizideki i. pointerın ilk elemanı ya da i. stringin ilk karakteri

    *(*(ptr+i)) dizi[i][0]

    *(*(ptr+a)+b) dizi[a][b] Dizideki a pointerının b e lemanı; dizinin a satırı b sütunundaki eleman

    **(ptr+a)+b dizi[a][0]+b İstediğimiz kullanımlardan biri değil !!

  • 21

    Dipnot

    ― Dizinin ilk elemanının adresi ya da dizinin ismi dizinin başlangıç adresini verir.

    dizi ↔ &dizi[0];

    ― Bir değişkenin adresi, değişkenin adının önüne & operatörü getirilerek öğrenilir ve bir pointerı yardımıyla tutulabilir.

    ― Bir pointerın gösterdiği adresteki değer, pointer adının önüne * operatörü getirilerek öğrenilebilir.

  • 22

    Dipnot

    ― Fonksiyonun ismi fonksiyonun adresini verir. Fonksiyonun adresini tutacak pointer, fonksiyon ile aynı dönüş tipine ve parametre tanımlamalarına sahip olmalıdır.

    dönüş_tipi (* pointer_adı)(parametreler) pointer_adı = fonksiyon_adı;

    ― int sayi; int *ptr1=