C de Struct ve Struct pointerlarının OK operatörü “->” ile kullanımı

Nuri Yavuz
3 min readJun 17, 2019

--

Struct ları kullanarak farklı tipteki verileri (int,char,long) aralarında belirli bir ilişki bulunmak şartıyla birarada tutabilmekteyiz.Bir öğrenci ve ona ait bilgiler ile bir örnek verelim;öğrencinin adı soyadı, numarası, yaşı vs. gibi bilgiler birbiri ile ilişkilidir ya da bir ülkenin il ilçe mahalle bilgileri birbiri ile ilişkilidir, hepsini belirli bir YAPI altında kullanmak işimizi kolaylaştırır.

İşlevsel olarak “struct” dizilere oldukça benzer ve aslında dizilerin biraz daha gelişmiş versiyonudur. Dizilerde sadece aynı tipten verileri bellekte sürekli bir şekilde saklıyabiliriz fakat yapılarda farklı tipten verileri de sürekli bir şekilde saklayabiliyoruz.

struct ulke{
int il;
int ilce;
int mahalle;
};

Yukarıda ulke adlı bir yapı(structure) oluşturduk. Bu yapının içinde yapıyı oluşturan değişkenler (yapı elemanları) bulunmaktadır. Dikkat edilmesi gereken nokta ise şudur : bu kod ile sadece struct bildirimi yapılır, yani bellekte şu an bu yapı için herhangi bir yer ayrılmamıştır. Bunu fonksiyonların prototiplerine benzetebiliriz. Yapmış olduğumuz bildirim ile ancak derleyiciyi bilgilendirmiş oluruz. Bellekte yer ayırma işlemi ise yapı türünden değişkenlerin tanımlanmasıyla olur. Burada bahsettiğim değişkenler, yapıyı oluşturan değişkenler ile karıştırılmamlıdır. Bir örnekle açıklarsak :

struct ulke{
int il;
int ilce;
int mahalle;
};
struct ulke konum;

Gördüğünüz gibi yapı(ulke) bildirdikten sonra yapı değişkenini (konum) tanımladık. Bu şekilde bellekte 12 bytelık bir yer tahsis edilmiş oldu. Dikkat ettiyseniz yapı değişkeninin tanımını yapı bildirimi yaptıktan sonra yaptık. Fakat ikisini beraber yapmamız da mümkün.Yani aşağıdaki şekildeki gibi;

struct tarih {
int gun;
int ay;
int yil;
} konum;

Tıpkı fonksiyonlarda olduğu gibi yapıyı nerede tanımladığınız önemlidir. Yapı bildirimini global olarak yaparsanız, yapıya ait değişken tanımını istediğiniz yerde yapabilirsiniz yani main içinde, oluşturduğunuz bir fonksiyonun içinde vs.Eğer yapıyı local olarak tanımlamışsanız, sadece yapı değişkenini tanımladığınız localde kullanabilirsiniz.

Oluşturduğumuz yapıya değer ataması yapalım;

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct zaman_yapisi
{
int saat,dakika,saniye;
}yapi_degiskeni;
int func(struct zaman_yapisi uzanti)
{
printf("%d %d %d",uzanti.saat,uzanti.dakika,uzanti.saniye);
}
int main()
{
yapi_degiskeni.saat = 13;
yapi_degiskeni.dakika = 20;
yapi_degiskeni.saniye = 40;
func(yapi_degiskeni);
getch();
}

Yapı Pointerları ve OK Operatörü “->”

struct zaman_yapisi
{
int saat,dakika,saniye;
}yapi_degiskeni;

Daha önce yukarıda tanımladığımız “struct zaman_yapisi” için yapi_degiskeni.saat , yapi_degiskeni.dakika , yapi_degiskeni.saniye gibi “.” nokta operatörü ile erişiyorduk,eğer yapı değişkenimiz bir pointer ise buna “->” ok operatörü ile erişebiliriz.Yani aşağıdaki gibi;

struct zaman_yapisi
{
int saat,dakika,saniye;
}*uzanti;

Yukarıda yapı pointerının nasıl tanımlanacağı gösterilmiştir.

uzanti->saat ya da (*uzanti).saat şeklinde. Ek olarak, -> operatörünü ancak yapı pointerları ile kullanabiliriz.

Aşağıda bir örnek verdim;

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct zaman_yapisi
{
int saat,dakika,saniye;
}yapi_degiskeni;
int func(struct zaman_yapisi *uzanti)
{
printf("%d %d %d",uzanti->saat,uzanti->dakika,uzanti->saniye);
}
int main() {
yapi_degiskeni.saat = 13;
yapi_degiskeni.dakika = 20;
yapi_degiskeni.saniye = 40;
func(&yapi_degiskeni);
getch();
}

--

--

Nuri Yavuz
Nuri Yavuz

Written by Nuri Yavuz

“No effect is before the cause” in the same time “Cause doesn’t necessarily come before effect”

No responses yet