struct (C programlama dili) - struct (C programming language)

Bir yapı olarak C programlama dilinde (ve birçok türevinin) a, bileşik veri tipi (veya kayıt farklı değişkenler tek ile erişilebilen sağlayan bir bellek bloğu bir isim altında değişken bir fiziksel olarak gruplandırılmış listesi tanımlar) bildirimi işaretçi veya aynı adresi döndüren struct bildirilen ad ile. Yapı veri türü diğer veri türlerini içerebilir, bu nedenle sabit sürücü dizini girişi (dosya uzunluğu, adı, uzantısı, fiziksel adresi vb.) Veya diğer karışık türdeki kayıtlar (ad , adres, telefon, bakiye vb.).

C yapısı , genellikle sözcük uzunluğu sınırlarıyla sınırlandırılan (boyutlandırılan) bitişik bir fiziksel bellek bloğuna doğrudan başvurur. Intel işlemciler için bazı derleyicilerde bulunan benzer adlandırılmış özelliğe karşılık gelir . Bitişik belleğin bir bloğu olarak, bir yapı içindeki her alan, başlangıçtan itibaren belirli bir sabit ofsette 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ü kullanılmalıdır, tıpkı ilkellerde olduğu gibi . Yapıdaki belirli alanların hizalanması ( kelime sınırlarına göre) uygulamaya özgüdür ve doldurma içerebilir, ancak modern derleyiciler tipik olarak #pragma pack hizalama için kullanılan bayt cinsinden boyutu değiştiren yönergeyi destekler .

In C ++ dilinin, bir yapı bir aynıdır C ++ sınıfına ancak farklı bir varsayılan görünürlüğü vardır: struct üyeleri varsayılan olarak ortak oysa sınıf üyeleri, varsayılan olarak gizli olduğu.

Diğer dillerde

C'deki struct veri türü, ALGOL 68 struct veri türünden türetilmiştir .

Kendi C meslektaşı gibi, içinde yapı veri türü C # ( Yapı içinde Visual Basic .NET ) bir benzer sınıfın . Bu dillerde bir yapı ve sınıf arasındaki en büyük fark, bir yapı bir işleve argüman olarak iletildiğinde, bu işlevdeki yapı üzerinde yapılan herhangi bir değişikliğin orijinal değişkende yansıtılmamasıdır (başvuruya göre geçiş yapılmadıkça) Kullanılmış).

Bu, sınıfların veya yapıların statik olarak tahsis edilebildiği veya yığın üzerinde (C # 'ye benzer) veya açık bir işaretçi ile yığın üzerinde dinamik olarak tahsis edilebildiği C ++' dan farklıdır. In C ++ , bir yapı ve arasındaki tek fark sınıfının bir yapı üyeleri ve baz sınıflar olmasıdır kamu varsayılan olarak. ( class Anahtar sözcükle tanımlanan bir sınıfın varsayılan olarak özel üyeleri ve temel sınıfları vardır.)

Beyanname

C'deki struct bildirimi için genel sözdizimi şöyledir:

struct tag_name {
   type member1;
   type member2;
   /* declare as many members as desired, but the entire structure size must be known to the compiler. */
};

İşte tag_name bazı bağlamlarda isteğe bağlıdır.

Böyle bir struct bildirim , bir tür diğer adının typedef bildirimi veya bir değişkenin bildirimi veya tanımı bağlamında da görünebilir :

typedef struct tag_name {
   type member1;
   type member2;
} struct_alias;

Başlatma

Bir yapıyı başlatmanın üç yolu vardır. için struct türü

/* Declare the struct with integer members x, y */
struct point {
   int    x;
   int    y;
};

Bitişik üyeler verilebildiği zaman, C89 tarzı başlatıcılar kullanılır.

/* Define a variable p of type point, and initialize its first two members in place */
struct point p = { 1, 2 };

Bitişik olmayan veya sıra dışı üye listesi için belirlenmiş başlatıcı stili kullanılabilir

/* Define a variable p of type point, and set members using designated initializers*/
struct point p = { .y = 2, .x = 1 };

Bir başlatıcı verilirse veya nesne statik olarak tahsis edilmişse , atlanan öğeler 0 olarak başlatılır.

Bir yapıyı başlatmanın üçüncü bir yolu, aynı tipteki mevcut bir nesnenin değerini kopyalamaktır.

/* Define a variable q of type point, and set members to the same values as those of p */
struct point q = p;

Görev

Bir yapı başka bir yapıya atanabilir. Bir derleyici, memcpy() böyle bir atama yapmak için kullanabilir .

struct point {
    int x;
    int y;
};

int main(void)
{
    struct point p = { 1, 3 };        /* initialized variable */
    struct point q;                   /* uninitialized */
    q = p;                     /* copy member values from p into q */
    return 0;
}

Yapılandırılacak işaretçiler

İşaretçiler, a'ya adresine göre başvurmak için kullanılabilir struct . Bu, yapıları bir işleve geçirmek için kullanışlıdır. İşaretçinin referansı * operatör kullanılarak kaldırılabilir . -> Operatör yapı (sol işlenen), işaretçiyi dereferences ve daha sonra yapı (sağ işlenen) bir üyesi olan bir değer erişir.

struct point {
   int x;
   int y;
};
struct point my_point = { 3, 7 };
struct point *p = &my_point;  /* p is a pointer to my_point */
(*p).x = 8;                   /* set the first member of the struct */
p->x = 8;                     /* equivalent method to set the first member of the struct */

Ayrıca bakınız

Referanslar