sayfa başı

26 Şubat 2019 Salı

C Çalışma Soruları – 20 (göstericiler)

Necati Ergin Hocamın kendi sayfasında bulunan çalışma sorularını ve cevaplarını burada yanıtlamaya çalıştım. Sorulara buradan ulaşabilirsiniz.

Aşağıdaki C programı çalıştırıldığında bu programın çıktısı ne olur?

#include <stdio.h>
 
int main()
{
    int a[5] = { -1, 3, 2, -2, 0};
    int *p = a + 3;
    int i;
    
    a[p[*p]]++;
    a[p[*p]]++;

    for (i = 0; i < 5; ++i)
        printf("%d ", a[i]);
        
    return 0;
}

Yanıt:
Sorunun yanıtına geçmeden önce *p ile p[0] aynı sonuçlar ürettiğini bilmek gerekir. Yani bu iki yöntemle pointer içeriğine ulaşabiliriz. Aşağıdaki iki satır koşulur ise aynı çıktıyı ürettiğini göreceksiniz.
   printf(" %d \n", p[0]);
   printf(" %d \n", *p);
Yukarıdaki temel bilgiler ile p[2] nin ne anlama geldiğini görebiliriz. p taşıdığı adresten, taşıdığı tür adresi biçiminde 2 adres ilerle ve içeriğini al manasına gelir.(p nin adresi değişmez.) Sorunun çözümüne geçelim.
a[p[*p]]++; ilk satırda *p, -2 değerini üretir. a[p[-2]]++; şekline döner. p[-2] demek p nin taşıdığı adresten 2 adres geri gel ve içeriğini al demektir. p nin taşıdığı adres a+3 olduğu için 2 gerisi a+1 olur ve içeriği de 3 olur. Bu durumda a[3]++;  şekline döner. Bu işlem sonucunda a nın 3. endeksli elemanı olan -2 ulaşıp değerini bir arttırmış oluruz ve -1 olur. Dizinin yeni hali aşağıdaki gibi olur.
{ -1, 3, 2, -1, 0}
Kodun geri kalanındaki a[p[*p]]++; kısmını da yukarıdaki açıklamalar doğrultusunda işlersek dizinin son hali { -1, 3, 3, -1, 0} olur ve çıktı olarak bu dizi elemanlarını alırız.

Hiç yorum yok:

Yorum Gönder

Son Ütücü