C’de Pointer Aritmetiği – 2 (Atama İşlemleri)

Bu yazıda  da, bir önceki yazıda giriş yaptığımız ve olası hatalardan kısaca söz ettiğimiz pointerlar ile atama işlemleri konusuna devam edeceğiz.

Bu ana kadar, pointer kullanarak yapılan işlemlerde izlenecek genel yöntemlerin kavranılmış olduğunu umuyorum. Şimdi, bu yöntemleri kullanarak, bir integer dizisi tanımlayalım. Bu dizi üzerinde gezmek için bir pointer tanımlayalım ve dizimize belli bir kurala göre değer ataması yapalım…

<h1>include <stdio.h></h1>
<h1>include <stdlib.h></h1>
int main()
{
int dizi[10];
int i;
//Bir dizi veya matrisin adresini bir pointer'a atamak için o dizinin veya matrisin adini yazmak yeterlidir.
//Bir dizi veya matrisin adi, ilk elemaninin adresini gosterir…
int *dizi_gezici_ptr;
dizi_gezici_ptr = dizi;
//Pointer artik dizinin ilk elemanini gosteriyor…
<pre><code>//Simdi dizimizin elemanlarina deger atamak icin kullanacagimiz kurala gore dizimizi pointer ile gezip guncelleme yapalim...

for(i=0;i<10;i++)
{
    *dizi_gezici_ptr = i*5;
    dizi_gezici_ptr++;
}

//Eger islemimizde bir hata yoksa, dizimizin elemanlari 0 dan itibaren 5 artarak devam edecektir...
//Dizimizi yazdirip degerleri kontrol edelim...

dizi_gezici_ptr = dizi; //Pointeri yeniden ilk elemana dondurduk...
for(i=0;i<10;i++)
{
    printf("Diziye dogrudan erisim ile %d. elemanin degeri: %d\n",i,dizi[i]);
    printf("Pointer uzerinden erisim ile %d. elemanin degeri: %d\n",i,*(dizi_gezici_ptr+i));
    printf("\n");
}
return 0;</code></pre>
}

Görüldüğü gibi pointer kullanarak bir diziyi gezdik, dizi elemanlarının değerlerini güncelledik ve diziyi yine pointer kullanarak yazdırdık.

Bir sonraki yazıda, pointer kullanarak tek ve çok boyutlu dizilerde arama algoritmaları geliştirme konusu üzerinde duracağız…

C’de Pointer Aritmetiği – 1 (Atama İşlemleri)

Şimdi Pointer(İşaretçi) kullanarak bir değişkenin değerini güncelleyelim. Bir önceki örneklerimize benzer bir örnek üzerinden devam edelim…

<h1>include <stdio.h></h1>
<h1>include <stdlib.h></h1>
int sayi = 100;
int *ptr_sayi;

ptr_sayi = &sayi;
//Onceki ornegimizde buraya kadar olan islemleri çözümlemiştik.

//Simdi pointer uzerinden sayi degiskeninin degerini degistirelim.

*ptr_sayi ++; // Ornegin 1 arttiralim…
printf("%d",sayi);

//Degiskenin degerine ulasmak icin pointerin basina "*" karakterini koydugumuza dikkat edelim…

//Eger arttirma islemini

ptr_sayi++;
printf("%d",sayi);

//seklinde yapmis olsaydik, ptr_sayi pointerinin gosterdigi adreste tutulan degeri degil, gosterdigi adres degerini 1 arttirmis olacaktik…

//Ornegin "sayi" degiskeninin adresi A123 ise, ptr_sayi pointerinin gosterdigi adres A123 olacaktir. Bu adreste tutulan deger de 100'dur.

//Eger islemi "*ptr_sayi++" seklinde yaparsak, A123 adresinde tutulan 100 degeri bir artip 101 olacaktir. Ancak islemi "ptr_sayi++" seklinde yaparsak, bu kez ptr_sayi pointerinin gosterdigi A123 adresini A124 yapmis ve bambaska bir degiskeni ya da null bir bellek hucresini gostermeye baslamis oluruz.

//Not: Pointerlar ile yapilan guncelleme islemleri dogrudan bellek hucresini etkilediginden, o bellek hucresini temsil eden degiskenin de degerinin degismesine yol acar…

ptr_sayi--;
printf("%d",sayi);
//Yukarida bilerek yanlis yaptigimiz islemi geri alalim…

*ptr_sayi = 200;

//"sayi" degiskeninin gosterdigi adreste tutulan deger 200 yapiliyor…

printf("%d",sayi);

//"sayi" degiskeni yazdirildiginda ekrana 200 yazilacaktir. Cunku ayni adresi gosteren pointer ile bu adreste tutulan degeri 200 e guncellemistik…

Görüldüğü gibi pointer aritmetiği ile karmaşık işlemler yapmak için, hatta bir hocamın tabiriyle Pointer aritmetiğini “hamur gibi yoğurmak için” öncelikle temel pointer işlemlerinin mantığını kavramalıyız.

Pointer aritmetiği ile yapılan işlemlerde, unutacağınız bir yıldız karakteri bile tüm belleğinizi yanlış yönlendirmenize ve ciddi boyutta veri kaybetmenize sebep olabilir…

Bir sonraki yazıda pointerlar arasında matematiksel işlemler yaparak, bellek hücrelerinin ve o hücreleri temsil eden değişkenlerin değerlerini değiştireceğiz…

C’de Pointer Aritmetiği – Giriş (2011)

Referans tabanlı gelişmiş diller var olmadan önce, bir veriye ulaşmak için pek güvenilir olmayan ancak doğru kontroller eşliğinde bir sistemi baştan aşağı yönetebilecek erişim yetkisine sahip olmamızı sağlayan yapı, “Pointer Aritmetiği”..

Pointer aritmetiğinin genel mantığına, bir aracı ya da container olmadan veriye işaretçilerle doğrudan ulaşmak da diyebiliriz.

İşaretçi Nedir ? (Pointer)

Değişkenlere ait adres değerlerini tutan değişkenlerdir. C ‘de tanımlanırken “*” ön ekini alırlar.

Hemen kısa bir kodla örnekleyelim…

int sayi = 100;
// 100 sayisini bellege yazdik. Ve bu sayiya ulasmak icin de sayi degiskenini tanimladik.

//Eger ki bu sayiyi yazdirmak istersek;

printf("sayi: %d\n",sayi);
//kodu ile oncelikle container degiskenimize baglanip daha sonra onun uzerinden degerimize ulasiriz.

//Bir de pointer kullanarak gorelim.

int *ptr_sayi;
//Su an ptr_sayi degiskeninin, herhangi bir degiskenin adresini tutacagini derleyicimize belirttik.

//Simdi bu pointer degiskenimize, tutacagi-gosterecegi adresi atayalim.

//Not: C''de bir degiskenin adresine ulasmak icin degisken adina on ek olarak '&'  karakteri kullanilir.

ptr_sayi = &sayi;
// Artik ptr_sayi pointerimiz, sayi degiskenimizin adresini gostermekte.

//Yani biz bu sayiyi pointer araciligi ile gostermek istersek;

printf("sayi: %d (Pointer ile…)\n",*ptr_sayi);
//bu sekilde ayni sayi degerini ekrana yazdirabiliriz.

//Not: Bir degiskene on ek olarak getirilen '*' karakteri, o degiskenin icerisinde tuttugu degeri adres baz alip, o adresin icinde bulunan degere ulasilmasini saglar.

Görüldüğü gibi C’de pointer işlemleri “*” ve “&” karakterleri üzerinden yürümektedir.
Not: Kullanıcıdan veri almak için kullanılan “scanf()” fonksiyonunda da alınan değerin atanacağı değişkene ön ek olarak “&” getirip, kullanıcıdan alınan değeri,bu değişkenin temsil ettiği adrese yazdığımızı hatırlayalım…

Şimdi işin içine bir de pointer karıştırdığımızda, neler olduğunu görelim…

Buraya kadar “*” ve “&” kullanımı ile ilgili aklımızda bir şeyler şekillendi ise, artık pointer aritmetiği örneklerine geçebiliriz…

Algoritma ve Programlama 1 Tüm Ödevler (2011)

Kodlarda ufak aksaklıklar olabilir. Onlar dışında sorunsuz çalışıyorlar.

Kodlara yorum satırları eklenmiştir. Anlayamadığınız noktalar için mesaj atabilirsiniz…

Algoritma ve Programlama – 1

1. Ödev

2. Ödev

3. Ödev

3. Ödev – Alternatif Çözüm

2011 – 2012 Algoritma – I Final Soruları ve Olası Çözümleri (Yalnızca programlama soruları)

Ege Üniversitesi Bilgisayar Mühendisliği 1. Sınıf Algoritma ve Programlama – 1 Dersi Final Soruları ve olası çözümleri… (Yalnızca programlama soruları)

Cevaplar:

Soru 3

Soru 4

Soru 5

Not: Sorular, kodların içinde yorum satırı olarak yer almaktadır.