C programlama dilinde struct

**C programlama dilinde, struct (yapı)**, bir bellek bloğunda tek bir ad altında fiziksel olarak gruplandırılmış değişkenler listesini tanımlayan ve farklı değişkenlere tek bir işaretçi (pointer) aracılığıyla erişilmesine izin veren bileşik bir veri türüdür. Struct veri tipi, başka veri türlerini içerebilir. Bu nedenle dosya uzunluğu, ad, uzantı... veya diğer karma türdeki kayıtlar gibi karma veri türü kayıtları için kullanılır.

Struct, genellikle sözcük uzunluğu sınırlarıyla sınıflandırılmış -boyutlandırılmış- bitişik bir fiziksel bellek bloğuna başvurur. Intel işlemciler için bazı derleyicilerde bulunan benzer şekilde adlandırılmış özelliğe karşılık gelir. Bitişik bellek bloğu olarak, bir yapı içindeki her alan, başlangıçtan itibaren belirli ve sabit bir offsette bulunur.

Bir yapının içeriği bitişik bellekte depolandığından, belirli bir yapı türünü depolamak için gereken bayt sayısını elde etmek için sizeof operatörü, tıpkı ilkeller için kullanılabileceği gibi kullanılmalıdır. Modern derleyiciler tipik olarak hizalama için kullanılan bayt cinsinden boyutu değiştiren *#pragma paketi* yönergesini destekler.

C++ dilinde bir struct, C++ sınıfıyla aynıdır. Farklı bir varsayılan görünürlüğe sahiptir. Sınıf üyeleri, varsayılan olarak özeldir. Fakat struct üyeleri varsayılan olarak geneldir.

## Diğer diller
C'deki struct veri tipi, ALGOL 68 struct veri türünden türetilmiştir. C#'taki struct veri türü, C'deki karşılığı gibi bir sınıfa benzer. Bu dillerde bir struct ile bir sınıf arasındaki en büyük fark, bir struct bir işleve argüman olarak iletildiğinde, o işlevdeki struct herhangi bir değişikliğin orijinal değişkene yansıtılmayacağıdır.

Bu, sınıfların veya struct'ların statik olarak veya C#'a benzer bir yığında açık bir işaretçiyle (pointer) dinamik olarak tahsis edilebildiği C++'dan farklıdır. C++'da bir struct ile bir sınıf arasındaki tek fark, bir struct üyelerinin ve temel sınıfların varsayılan olarak genel olmasıdır.

## Açıklama
C'deki bir struct:
```c
struct tag_name {
   type member1;
   type member2;
  
};
```
şeklinde tanımlanır.

typedef ile struct yazılmak istenirse:
```c
typedef struct tag_name {
   type member1;
   type member2;
} struct_alias;
```
şeklinde tanımlanabilir.

## Başlatma
Bir struct'ı başlatmanın üç yolu vardır. Struct türü için:
```c
struct point {
   int    x;
   int    y;
};
```
Bitişik üyeler verildiğinde C89 tipi başlatıcılar kullanılır.
```c
struct point p = { 1, 2 };
```
Bitişik olmayan üyeler için belirlenmiş başlatıcı stili kullanılabilir.
```c
struct point p = { .y = 2, .x = 1 };
```
Bir başlatıcı verilirse veya nesne statik olarak verilirse, atlanan öğeler 0'dan başlatılır.

Struct başlatmanın üçüncü yolu ise aynı türden var olan bir nesnenin değerini kopyalamaktır. 
```c
struct point q = p;
```


## Atama
Bir struct başka bir struct'a atanabilir. Bir derleyici, böyle bir atamayı gerçekleştirmek için *memcpy()* fonksiyonunu kullanır. 
```c
struct point {
    int x;
    int y;
};

int main(void)
{
    struct point p = { 1, 3 };       
    struct point q;
    q = p;              
    return 0;
}
```


## Struct işaretçileri
İşaretçiler, bir struct'a adresiyle ulaşmak için kullanılabilir. Bu, struct'ları bir işleve geçirmek için işlevseldir. İşaretçinin referansı * operatörü kaldırılabilir. -> operatörü, işaretçiyi struct referansını kaldırır. Ardından yapının bir üyesinin değerine erişir.
```c
struct point {
   int x;
   int y;
};
struct point my_point = { 3, 7 };
struct point *p= &my_point;
(*p).x=8;
p->x = 8;
```


## Kaynakça