Skip to content

Structure

0Shares
Image

ما هي الـ Structure؟

هي مجموعة من البيانات المتعلقة ببعضها البعض تحت اسم واحد, يمكن أن يكونوا من نفس نوع البيانات أو لا

تستخدم ال structure لتعريف user define data type
يتم انشاؤها كالاتي:
 
    struct Rectangle {
	int length; // 4 byte
	int width; // 4 byte
	  
		     // total = 8 byte
};   
            
                    
        

في هذه اللحظة هي لا تحجز اي مساحة في ال memory بسبب انه فقط تعريف لل struct

اذا قمنا بتعريف متغير من هذا النوع سوف يحجز مساحة في ال memory  مقدارها 8 BYTE

حجم ال STRUCT: مجموع المساحة التي يشغلها عناصرها, في هذه الحالة    4+4 = 8 byte

الان سنقوم بانشاء متغير من نوع struct

    #include<stdio.h>
struct Rectangle {
    int length; // 4 byte
    int width; // 4 byte
};

int main() {

    struct Rectangle r; // declaration
    printf("%d", sizeof(r)); // 8 Byte

    struct Rectangle x = {10, 15}; // declaration + initialization

    return 0;
}   
            
                    
        
Screenshot 2025-08-29 223107

الوصول إلى عناصر Structure

نصل الى عناصر ال struct عن طريق dot operator(.)

    #include<stdio.h>

struct Rectangle {
    int length; // 4 byte
    int width; // 4 byte
};

int AreaOfRectangle(int length, int width);

int main() {
    
    struct Rectangle r = {10, 15}; // declaration + initialization
    r.length = 20;
    r.width = 4;
    printf("the Area of Rectangle is: %d",AreaOfRectangle(r.length, r.width));

    return 0;
}

int AreaOfRectangle(int length, int width) {
    return length * width;
}   
            
                    
        

  قمنا بالوصول الى العناصر وتحديث القيم باستخدام (.) operator, سيتم تعديل القيم داخل ال stack كالاتي

Screenshot 2025-08-29 223153

من الامثلة على استخادم ال struct, وضع معلومات عن الطاب مثل: رقم التعريف, الاسم, القسم الذي يدرس فيه و عنوانه

    #include<stdio.h>

struct Student {
    int id; // 4 Byte
    char name[25]; // 25 Byte
    char dept[25]; // 25 Byte
    char address[50]; // 50 Byte
                      // total of Byte = 4 + 25 + 25 + 50 = 104 Byte
};

int main() {

    struct Student s = {23112, "Ramadan Masoud", "Computer Engineering", "Ramallah"};
    printf("student id is: %d\n"
                 "the name of student: %s\n"
                 "the department is: %s\n"
                 "address: %s", s.id, s.name, s.dept, s.address);
    return 0;
}
   
            
                    
        

Array of Structures

يمكننا انشاء Array of struct و كأن اصبح لدينا مجموعة من المتغيرات كل متغير يمكنه الوصول ال عناصر ال struct

struct student s[50] اصبح لدينا 50 طالب وبامكاننا الوصول اليهم عن طريق ال indexing.

{……..,{third_student} ,{second_student} ,{first_student}}

    #include<stdio.h>

struct Student {
    int id;
    char name[25];
    char dept[25];
    char address[50];
};

int main() {
    struct Student s[50] = {{23112, "Ramadan Masoud", "Computer Engineering", "Ramallah"},
                        {1431, "Rami", "Civil Engineering", "Ramallah"}};
    // you can keep adding more students!!

    for (int i = 0; i < 2; i++) {
        printf("for student: %d\n", i + 1);
        printf("student id is: %d\n", s[i].id);
        printf("student name: %s\n", s[i].name);
        printf("the department is: %s\n", s[i].dept);
        printf("address: %s\n\n", s[i].address);
    }
	
	// or using one printf()
	for (int i = 0; i < 2; i ++) {

        printf("for student: %d\n"
                 "student id is: %d\n"
                 "the name of student: %s\n"
                 "the department is: %s\n"
                 "address: %s\n\n", i + 1, s[i].id, s[i].name, s[i].dept, s[i].address
                 );
    }
	
    return 0;
}
   
            
                    
        

Structure Padding

 في البداية قلنا ان حجم ال struct هو مجموع المساحة التي يشغلها عناصرها(لغرض التسهيل), وهذا ليس صحيحا:

لنفرض أن لدينا معالج بمعمارية bit-32, في كل دورة يقرأ 1 word والتي تساوي 4 byte

    #include<stdio.h>

struct abc {
	char a; // 1 byte
	char b; // 1 byte
	int c; // 4 byte
	       // total = 8 Byte
}   
            
                    
        

في هذه الحالة حجم ال struct ليس 6 byte بل 8 byte

لأن  a, b سوف يحجزوا 2 byte و c 4 byte فالمعالج سيقرأ c في دورتين, فسيتم عمل padding ل a b بمساحة فارغة مقدارها 2 byte

في هذه الحالة سيقرأ المعالج في الدورة الأولى a b وهذه أول 4 byte والثانية c بمقدار 4 byte ويصبح المجموع 8 byte

ملاحظة: عند عمل padding لنوع بيانات يحجز 1 byte الى 4 byte سوف يستخدم فقط 1 byte من اصل 4, لأنه أسهل على الالة القراءة ك 4 byte

لكن ماذا لو اختلف الترتيب كالاتي:

    #include<stdio.h>

struct abc {
	char a; // 1 byte
	int b; // 1 byte
	char c; // 4 byte
	       // total = 12 Byte
}   
            
                    
        

 في هذه الحالة عدم عمل ال padding يؤدي ال قراء 1 byte من a و 3 byte من b في الدورة الاولى وفي الدورة الثانية سيقرأ ال byte الاخير من b و 1 byte من c, تم قراءة b في دورتين

فسيتم عمل padding ل a و c كل منهما فتصبح المساحة 4 byte لكل منهما بدل 1 byte, وفي هذه الحالة سيقرأ في الدورة الأولى a والثانية b و الثالثة c فيصبح المجموع 12 byte

كيف نقلل حجم المساحة؟

قم بترتيب العناصر من الأصغر الى الأكبر كالأتي:

    #include<stdio.h>

struct abc {
	int a; // 4 byte
	char b; // 1 byte
	char c; // 1 byte
	       // total = 8 Byte
}   
            
                    
        
WhatsApp Image 2025-08-29 at 23.42.39_84cadadd

الملخص

 تمكنك ال struct من تجميع انواع مختلفة من البيانات تحت نوع واحد

حجمها قد يختلف حسب ال padding

قم بترتيب العناصر من الأكبر الى الأصغر لتقليل الحجم

0Shares

YOU MAY LIKE THIS

Array Basic
Array Basic
أغسطس 19, 20253 min read

Leave a Comment

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Image Not Found

MOST DISCUSSED

0
Would love your thoughts, please comment.x
()
x