İçeriğe atla

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.[1]

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.[2] 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.[3]

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.[4]

struct point p = { 1, 2 };

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

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.[6] 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. 

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

<span class="mw-page-title-main">Pascal (programlama dili)</span> yüksek seviyeli programlama dili

Pascal bilgisayar programlama dili pek çok öğrenciye bilgisayar programlamayı öğreten ve çeşitli versiyonları bugün hâlâ yaygın olarak kullanılmaya devam eden en önemli programlama dillerinden biridir. İlk Macintosh işletim sisteminin çoğu ve TeX Pascal ile yazılmıştır.

Komut kümesi mimarisi, CPU'nun yazılım tarafından nasıl kontrol edileceğini tanımlayan bilgisayar soyut modelinin bir parçasıdır. ISA, işlemcinin ne yapabileceğini ve bunu nasıl yapacağını belirterek donanım ve yazılım arasında bir arayüz gibi davranır.

<span class="mw-page-title-main">C++</span> bir programlama dili

C++, Bjarne Stroustrup tarafından 1979 yılında Bell Laboratuvarları'nda geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir.

<span class="mw-page-title-main">Java</span> açık kaynak kodlu, nesneye yönelik, zeminden bağımsız, yüksek verimli, çok işlevli, yüksek seviye, adım adım işletilen bir programlama dili

Java, Sun Microsystems mühendislerinden James Gosling tarafından geliştirilmeye başlanmış açık kaynak kodlu, nesneye yönelik, platform bağımsız, yüksek verimli, çok işlevli, yüksek seviye, hem yorumlanan hem de derlenen bir dildir.

Programlama dillerinde işaretçi, bellek adresi tutmak için tasarlanmış bir türdür.

Şablon Metaprogramlama, C++ programlama dilinde derleme zamanında hesaplama yapan programlar yazmaktır.

<span class="mw-page-title-main">Bellek yönetimi</span>

Ana belleğin işlemler arasında paylaştırılmasına ana bellek yönetimi ya da bellek yönetimi adı verilir. İşletim sisteminin bu amaçla oluşturulan kesimine de bellek yöneticisi adı verilir.

IP adresi, interneti ya da TCP/IP protokolünü kullanan diğer paket anahtarlamalı ağlara bağlı cihazların, ağ üzerinden birbirleri ile veri alışverişi yapmak için kullandıkları adres.

Veri yapısı, bilgisayar ortamında verilerin etkin olarak saklanması ve işlenmesi için kullanılan yapı.

Arabellek aşımı ya da arabellek taşkını, iki yazılım arasında veri iletişimi için ayrılmış olan bir arabelleğe boyutundan daha fazla veri konulması ile ortaya çıkan durumdur.

Programlama dizisinde nesne-yönelimli programlamada, nesne, basit yapılı blok programları olarak kullanılan, işletim zamanı verilerinin saklanması için oluşturulmuş özel birimidir. Programın işlemlerde bir koleksiyon gibi veya programın bilgisayarda komutlar listesi gibi basitçe göründüğü geleneksel bakış açısının tersine, bu nesneler birbiri üzerinde rol oynar. Her nesne mesaj alımına, veriyi işlemeye ve diğer nesnelere veri aktarımına yatkındır. Her nesne farklı rollerde ve sorumluluklarda yer alan veya bağımsız küçük makineler olarak gözlemlenebilir.

<span class="mw-page-title-main">Özyineleme</span>

Özyineleme ya da yinelge, en genel anlamıyla bir yapının yinelenmesidir. Özellikle matematik ve bilgisayar biliminde kullanılır. Bu yapılara yinelgen yapılar denir. Yinelgen bir yapı eğer kendine gönderme yapma özelliğiyle yinelgen ise bu tür yapılara özgöndergeli ya da kendine-göndergeli yapılar denir.

Cg Nvidia tarafından Microsoft la yakın işbirliği ile, tepe ve nokta tarayıcıları programlayabilmek için geliştirilen yüksek seviye bir tarayıcı dilidir. Microsoft un HLSL sine benzer. Cg C tabanlı olması ve aynı söz dizilimini kullanmasına rağmen,C nin bazı özellikleri düzenlenmiş, renk ve normal gibi yeni veri tipleri eklenmiştir.

Nesne yönelimli programlama dillerinde arayüz, değişik sınıflardan nesnelerin kategorize edilmesini sağlayan bir soyut tür çeşitidir. Tanımlanmakta olan kategorinin birbirleriyle alakasız sınıfları ortak bir çatı altında toplaması nedeniyle, arayüz tanımları, soyut sınıfların aksine, listeledikleri iletilerin gerçekleştirim ayrıntısı olan herhangi bir bilgi içeremezler. Dolayısıyla, bir arayüz tanımı iletilere karşılık gelen bir altyordam gövdesi veya altalan tanımı içeremez. Bir başka açıdan bakarsak, arayüz tanımında yer alan programlama öğelerinin zaman içinde değişme olasılığı düşük öğeler olması gerekir. Buna göre, arayüz tanımları gerçekleştirimci ile kullanıcının paylaştığı ve sabit olma özelliği bulunan altyordam imzaları ile simgesel sabit tanımlarını barındırabilir.

<span class="mw-page-title-main">OpenMP</span>

OpenMP; Solaris, IBM AIX, HP-UX, GNU/Linux, MAC OS X ve Windows işletim sistemleri üzerinde çoğu işlemci mimarisi üzerinde Fortran, C++, C programlama dillerinde çoklu platform paylaşımlı bellek çoklu işlemeyi destekleyen bir uygulama geliştirme arayüzüdür, yani bir API'dir. OpenMP derleyici yönergelerinin kütüphane rutinlerini ve ortam değişkenlerinin çalışma zamanı davranışını etkileyen bir kümesini içerir.

Dart, ilk kez Google tarafından geliştirilen ve daha sonraları ECMA tarafından standart (ECMA-408) haline getirilen açık kaynaklı ve genel-amaçlı bir programlama dilidir. Dart dili kullanılarak web, sunucu, mobil uygulamalar ve IoT cihazları geliştirilebilir.

Medyan bir anakütle ya da örneklem veri serisini küçükten büyüğe doğru sıraladığımızda, seriyi ortadan ikiye ayıran değere denir. İstatistiğin bir alt dalı olan betimsel istatistikde medyan bir merkezsel konum ölçüsü kabul edilir.

Bilgisayar biliminde boş işaretçi, sıfır referansı veya boş gösterici, geçerli bir nesne adresini göstermeyen işaretçi ya da dolaylamaya verilen genel isimdir. Bir başka deyişle, değeri sıfır olan işaretçidir; yani bilgisayarın belleğinde geçerli olan bir adresi işaret etmemektedir. Bilgisayar programlarında, uzunluğu bilinmeyen bir listenin sonu veya bazı eylemlerin gerçekleştirilememesi gibi koşulları göstermek için rutin olarak boş işaretçiler kullanır; boş işaretçilerinin bu kullanımı, sıfırlanabilir tip veya opsiyonel bir veri tipi gibi düşünülebilir.

Tanımsız durum, programlamada bir standartın bir durumu tanımlayamacağı durumlara denmektedir.