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ü