duyuruElektroArge.com'a Hoşgeldiniz. Üye Olmak İçin Tıklayın. duyuru





houseForum ana sayfa   iletişimİletişim   bilgiSSS  
kırmızı yeşil mavi
ekleKayıt  anahtarGiriş
evForum ana sayfa goE-Kütüphane goE-Ders goC
 

  • Reklam

Ders 47 Yapıları Göstericiler İle Kullanmak

C Dili Dersleri - Okan Bilke

Ders 47 Yapıları Göstericiler İle Kullanmak

Mesajgönderen okanbilke » 03 Mar 2014 00:52

Yapıların göstericiler ile birlikte kullanılması, göstericilerin C'nin diğer türleri ile birlikte kullanımından farklı değildir. Yapıların göstericiler ile kullanılması bize birçok avantaj sağlar. Bunlardan ilki, tahmin edebileceğiniz gibi belleğin verimli kullanılmasıdır. Ders 34 Göstericiler (Pointers) dersinde bu durumdan bahsetmiştik.
Şimdi yapılar ile göstericilerin ilişkisine geçmeden önce, bir yapının bellekte ne kadar yer kapladığını görelim. Bir yapı bellekte, elemanlarının toplam uzunluğu kadar yer kaplar. Buna göre aşağıdaki yapı bildirimi bellekte 4 + 4 + 4 = 12 Byte ' lık yer tutacaktır:
struct ogrenci
{
int ogrenci_no; // 4 Byte
float ogrenci_kilo; // 4 Byte
float ogrenci_boy; // 4 Byte
}

Şimdi programımızda bir çok fonksiyon kullandığımızı ve yukarıdaki yapı bildirimini de bu fonksiyonlara aktardığımızı düşünelim. Bu durumda yapıyı her aktardığımız fonksiyon için bellekte 12 Byte'lık yer işgal edecektik. Oysa birazdan göreceğimiz şekilde göstericileri kullanarak fonksiyonlara sadece yapının adresini ileteceğiz. Böylece bellekte sadece birkez 12 Byte'lık yer tutulmuş olacak ve tüm fonksiyonlar sahip olduğu gösterici sayesinde bu 12 Byte'lık yeri kullanacak.
Şimdi yapı türünde bir göstericinin nasıl tanımlanıp kullanıldığını görelim. Önce yeni bir yapı bildirimi yapalım:
struct futbol_takim
{
char *takim_isim;
int kurulus_yil;
int oynadigi_lig;
int lig_sirasi;
int sampiyonluk_sayisi;
};

Şimdi bu yapının türünde bir değişken tanımlayalım:
struct futbol_takim a;

Şimdi de bellekte bu yapıyı gösteren bir gösterici değişkeni tanımlayalım ve a değişkeninin adresini göstericiye atayalım:
struct futbol_takim *b;
b = &a;

İşte, artık futbol_takim türünde, b isminde bir göstericimiz var. Bu gösterici bellekte a değişkenini göstermektedir. Bu göstericiyi de daha önce öğrendiğimiz göstericiler gibi kullanacağız.
Şimdi b göstericisini kullanarak yapıya bazı değerler atayalım, daha sonra da bu değerleri ekrana yazdıralım.
(*b).kurulus_yili = 1905;

Bu satır ile b göstericisi ile kullandığımız yapının kurulus_yili elemanına 1905 değerini atadık. Bu değeri ekrana yazdırmak için ise şu dizilimi kullanabiliriz:
printf("%d", (*b).kurulus_yili);

Bu satır ekrana 1905 ifadesini yazdıracaktır.
b göstericisinin yanındaki parantez işaretlerine dikkat ediniz. Bu parantezleri kullanma sebebimiz nokta operatörünün(.) önceliğinin içerik operatörünün(*) önceliğinden yüksek olmasıdır. Bu durumun önüne geçmek için içerik operatörünü parantez içine alıyoruz ve böylece ilk öneliği bu işleme vermiş oluyoruz.
Şimdi bu yapmış olduğumuz örneği program haline getirerek sonuçları inceleyelim.
//yapilarin_fonksiyonlara_aktarimi.c - 02.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

struct futbol_takim
{
char *takim_isim;
int kurulus_yili;
int oynadigi_lig;
int lig_sirasi;
int sampiyonluk_sayisi;
};

int main()
{
struct futbol_takim a;
struct futbol_takim *b;
b = &a;

(*b).takim_isim = "galatasaray";
(*b).kurulus_yili = 1905;
(*b).oynadigi_lig = 1;
(*b).lig_sirasi = 2;
(*b).sampiyonluk_sayisi = 19;

// şimdi bu bilgileri ekrana yazdıralım:

printf("takim isim: %s\n", (*b).takim_isim);
printf("kurulus yili: %d\n", (*b).kurulus_yili);
printf("oynadigi lig: %d\n", (*b).oynadigi_lig);
printf("lig sirasi: %d\n", (*b).lig_sirasi);
printf("sampiyonluk sayisi: %d\n", (*b).sampiyonluk_sayisi);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

Şimdi programın ekran çıktısını görelim:
takim isim: galatasaray
kurulus yili: 1905
oynadigi lig: 1
lig sirasi: 2
sampiyonluk sayisi: 19

Yapı Göstericilerinin Fonksiyonlara Aktarılması

Şimdi yapıların fonksiyonlara göstericilerle aktarılması ile ilgili bir örnek yapalım. Hatırlayacağınız gibi Ders 46 Yapıların Fonksiyonlara Aktarılması dersindeki yapilarin_fonksiyonlara_aktarimi.c programımızda tanımladığımız yapıyı fonksiyona geçirirken gösterici kullanmamıştık. Bu durumda fonksiyon başlığı içinde yeni bir yapı daha tanımlanmış oldu. Şimdi ise fonksiyona yapının kendisini değil adresini geçireceğiz. Böylece aynı yapıdan bellekte gereksiz yere iki adet bulunmamış olacak.
//yapi_gostericilerinin_fonk_aktarimi.c - 02.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

struct futbol_takim
{
char *takim_isim;
int kurulus_yili;
int oynadigi_lig;
int lig_sirasi;
int sampiyonluk_sayisi;
};

void yazdir(struct futbol_takim *);

void yazdir(struct futbol_takim *pt)
{
// ekrana yazdır:
printf("takim isim: %s\n", (*pt).takim_isim);
printf("kurulus yili: %d\n", (*pt).kurulus_yili);
printf("oynadigi lig: %d\n", (*pt).oynadigi_lig);
printf("lig sirasi: %d\n", (*pt).lig_sirasi);
printf("sampiyonluk sayisi: %d\n", (*pt).sampiyonluk_sayisi);
}

int main()
{
struct futbol_takim a;
struct futbol_takim *b;

b = &a;

// önce bilgileri gir:
(*b).takim_isim = "galatasaray";
(*b).kurulus_yili = 1905;
(*b).oynadigi_lig = 1;
(*b).lig_sirasi = 2;
(*b).sampiyonluk_sayisi = 11;

// bilgileri ekrana yazalım:
yazdir(b);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

Programın ekran çıktısı:
takim isim: galatasaray
kurulus yili: 1905
oynadigi lig: 1
lig sirasi: 2
sampiyonluk sayisi: 19

Programda 41. satırda b göstericisin tuttuğu adresi(yapının adresi) 16. satırdaki fonksiyona aktardığımıza dikkat ediniz.

Ders İçinde Yazılmış Tüm Programlar ve Kodları Ektedir:
Mesaj içeriğini görmek için kayıt ve giriş gerektirir

DERS 48 İÇ İÇE (NESTED) YAPILAR

C Dili Dersleri Ders Listesi
okanbilke@gmail.com
Kullanıcı avatarı
okanbilke
Site Kurucusu
Site Kurucusu
 
Mesajlar: 721
Beğendiklerim: 0 mesaj
Beğenilenlerim: 0 mesaj
Kayıt: 15 Mar 2013 13:09
Konum: Ankara

Reklam

Dön C

Kimler çevrimiçi

Bu forumu gezen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 0 misafir


  • Reklam