**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:

```
struct tag\_name {
 type member1;
 type member2;
 
};

```
şeklinde tanımlanır.

typedef ile struct yazılmak istenirse:

```
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:

```
struct point {
 int x;
 int y;
};

```
Bitişik üyeler verildiğinde C89 tipi başlatıcılar kullanılır.

```
struct point p = { 1, 2 };

```
Bitişik olmayan üyeler için belirlenmiş başlatıcı stili kullanılabilir.

```
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. 

```
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. 

```
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.

```
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
--------

1. ↑  "Struct memory layout in C". *Stack Overflow*. 9 Ekim 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Haziran 2021.
2. ↑  Ritchie, Dennis M. (1 Mart 1993). "The development of the C language". *ACM SIGPLAN Notices*. **28** (3): 201-208. doi:10.1145/155360.155580. ISSN 0362-1340.
3. ↑  "Parameter passing in C#". 24 Aralık 2002 tarihinde kaynağından arşivlendi.
4. ↑  Kelley, Al (1998). *A book on C : programming in C*. 4th ed. Ira Pohl. Reading, Mass.: Addison-Wesley. ISBN 0-201-18399-4. OCLC 37783098. 3 Mart 2009 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Haziran 2021.
5. ↑  "Initialization of structures and unions". *www.ibm.com* (İngilizce). 4 Haziran 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Haziran 2021.
6. ↑  "The New C Standard: 6.7.8". *c0x.coding-guidelines.com*. 18 Şubat 2006 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Haziran 2021.