Latest web development tutorials

بنية C

C يسمح لك لتحديد مجموعة من نفس النوع يمكن تخزينها في بنود البيانات المتغيرة،وهيكل البرمجة C أنواع البيانات المعرفة من قبل مستخدم آخر المتاحة، والذي يسمح لك لتخزين أنواع مختلفة من عناصر البيانات.

بنية استخدامها لتمثيل رقما قياسيا، افترض أنك تريد أن تتبع الكتب مكتبة ديناميكية، قد تحتاج إلى تتبع كل كتاب الخصائص التالية:

  • لقب
  • مؤلف
  • موضوع
  • معرف كتاب

هيكل تعريف

من أجل تحديد هيكل، يجب عليك استخدام العبارةالبنية.يحدد بيان بنية نوع بيانات جديد يحتوي على عدد وافر من أعضاء، وبيان شكل البنية كما يلي:

struct [structure tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];  

العلامة هيكل اختيارية، كل تعريف العضو هو تعريف موحد للمتغير، مثل كثافة العمليات ط؛ أو تطفو و، أو غيرها من التعريفات المتغيرة صالحة.في نهاية بنية محددة، وآخر واحد قبل الفاصلة المنقوطة، يمكنك تحديد واحد أو أكثر من المتغيرات الهيكلية، الذي هو اختياري. هنا هو هيكل إعلان حجز حسب:

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;  

الوصول إلى عضو بنية

من أجل الوصول إلى أعضاء بنية، ونحن نستخدمالمشغل وصول أعضاء (.).مشغل وصول الأعضاء هو بنية فترة أسماء وهياكل أعضائنا متغير تريد الوصول بينهما. يمكنك تحديد نوع هيكل متغيرباستخدام الكلمة الأساسية لبنية.يوضح المثال التالي استخدام هيكل:

#include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Book */
   struct Books Book2;        /* 声明 Book2,类型为 Book */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   printf( "Book 1 title : %s\n", Book1.title);
   printf( "Book 1 author : %s\n", Book1.author);
   printf( "Book 1 subject : %s\n", Book1.subject);
   printf( "Book 1 book_id : %d\n", Book1.book_id);

   /* 输出 Book2 信息 */
   printf( "Book 2 title : %s\n", Book2.title);
   printf( "Book 2 author : %s\n", Book2.author);
   printf( "Book 2 subject : %s\n", Book2.subject);
   printf( "Book 2 book_id : %d\n", Book2.book_id);

   return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

هيكل كمعلمة وظيفة

يمكنك وضع هيكل كمعلمة وظيفة، وبطريقة مماثلة في مجلس الشيوخ إلى أنواع أخرى من المتغيرات أو المؤشرات. يمكنك استخدام المثال أعلاه الطريق للوصول إلى المتغيرات هيكل:

#include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* 函数声明 */
void printBook( struct Books book );
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Book */
   struct Books Book2;        /* 声明 Book2,类型为 Book */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   printBook( Book1 );

   /* 输出 Book2 信息 */
   printBook( Book2 );

   return 0;
}
void printBook( struct Books book )
{
   printf( "Book title : %s\n", book.title);
   printf( "Book author : %s\n", book.author);
   printf( "Book subject : %s\n", book.subject);
   printf( "Book book_id : %d\n", book.book_id);
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

مؤشر إلى بنية

يمكنك تحديد مؤشر بنية وطريقة تعريف روابط لأنواع أخرى مماثلة من متغير مؤشر، على النحو التالي:

struct Books *struct_pointer;

الآن يمكنك معالجة المتغيرات بنية تخزين في التعريف المذكور أعلاه لمتغير المؤشر. للعثور على عنوان المتغير الهيكل، وومشغل أمام اسم هيكل، على النحو التالي:

struct_pointer = &Book1;

استخدام مؤشر للوصول إلى نقطة هيكل عضو في الهيكل، يجب عليك استخدام -> المشغل، على النحو التالي:

struct_pointer->title;

دعونا نستخدم مؤشر هيكل لإعادة كتابة المثال أعلاه، وسوف تساعدك على فهم مفهوم مؤشرات هيكل:

#include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Book */
   struct Books Book2;        /* 声明 Book2,类型为 Book */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 通过传 Book1 的地址来输出 Book1 信息 */
   printBook( &Book1 );

   /* 通过传 Book2 的地址来输出 Book2 信息 */
   printBook( &Book2 );

   return 0;
}
void printBook( struct Books *book )
{
   printf( "Book title : %s\n", book->title);
   printf( "Book author : %s\n", book->author);
   printf( "Book subject : %s\n", book->subject);
   printf( "Book book_id : %d\n", book->book_id);
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

حقل بت

يتم تخزين بعض المعلومات وليس بحاجة إلى اتخاذ بايت الكامل، في حين يمثل واحدة فقط أو عدد قليل من البتات. على سبيل المثال، عند تخزين مفتاح، اثنين فقط من الدول 0 و 1، مع قليل ثنائي. لتوفير مساحة التخزين، والعملية بسيطة، لغة C ويوفر بنية بيانات تسمى "حقل بت" أو "الجزء الشيء."

ما يسمى ب "حقل بت" بايت واحد في ثنائي مقسمة إلى عدة مناطق مختلفة، وتشير إلى عدد البتات في كل منطقة. كل مجال له اسم نطاق، مما يسمح البرنامج لتعمل وفقا لاسم المجال. حتى نتمكن من وضع عدة كائنات مختلفة مع حقل بايت ثنائي بت لتمثيل.

أمثلة نموذجية:

  • عند تخزين مفتاح مع ثنائي، اثنين فقط من الدول 0 و 1.
  • قراءة تنسيقات الملفات الخارجية - يمكن قراءة صيغ الملفات غير القياسية. على سبيل المثال: صحيح 9-بت.

وصف يحدد المتغيرات حقل بت وحقل بت

تعريفات حقل بت وتعاريف هياكل مماثلة إلى النموذج:

    struct 位域结构名
        { 位域列表 };

والتي تشكل قائمة حقل بت هي:

    类型说明符 位域名: 位域长度 

على سبيل المثال:

struct bs{
    int a:8;
    int b:2;
    int c:6;
};

بنفس الطريقة وصف المتغيرات bitfield والمتغيرات هيكل وصفها. يمكن استخدامه بعد يصف أول تعريف ويحدد تعليمات إما توضيح مباشرة هذا في ثلاث طرق. على سبيل المثال:

struct bs{
    int a:8;
    int b:2;
    int c:6;
}data;

وصف للبيانات متغيرة BS، ما مجموعه اثنين بايت. التي شكلت لحقل 8 بت شكلت حقل قليلا ب لمدة سنتين، وهو ما يمثل الحقل 6 قليلا ج.

دعونا ننظر إلى مثال على ذلك:

struct packed_struct {
  unsigned int f1:1;
  unsigned int f2:1;
  unsigned int f3:1;
  unsigned int f4:1;
  unsigned int type:4;
  unsigned int my_int:9;
} pack;

هنا، ويشمل packed_struct ستة أعضاء: أربعة f1..f4 معرف 1-بت، وهو نوع 4 بت وmy_int 9-بت.

لتعريف حقل بت هناك الإرشادات التالية:

  • يجب أن يتم تخزين حقل بت في بايت واحد، لا تمتد اثنين بايت. مثل عندما بايت هو عدم ترك مساحة كافية لتخزين مجال آخر، يجب أن تكون وحدة التخزين القادمة من الميدان قليلا. ويمكن أيضا التعليق عمدا المجال من الوحدة التالية. على سبيل المثال:

    struct bs{
        unsigned a:4;
        unsigned  :4;    /* 空域 */
        unsigned b:4;    /* 从下一单元开始存放 */
        unsigned c:4
    }
    

    في هذا التعريف حقل بت، قالت أربعة أجزاء من البايت الأول بعد أربع أنها لم تستخدم لملء 0، ب من البايت الثاني، وتحتل 4، ج تحتل أربعة.

  • لأنه لا يسمح المجال قليلا عبر وحدتي بايت، وبالتالي فإن طول حقل بت لا يمكن أن يكون أكبر من طول بايت واحد، وهذا ليس أكثر من 8 ثنائي. إذا كان الحد الأقصى لطول أكبر من كامل طول كلمة الكمبيوتر، بعض المجمعين قد تسمح منطقة تداخل الذاكرة، وبعض المجمعين قد وضعت أكثر من جزء من المجال تخزين الكلمة التالية.
  • حقول بت يمكن أن يكون حقل بت لم يكشف عن اسمه، ثم يتم استخدامه فقط كما تعبئة أو تعديل موقف. حقل بت لم يذكر اسمه لا يمكن استخدامها. على سبيل المثال:

    struct k{
        int a:1;
        int  :2;    /* 该 2 位不能使用 */
        int b:3;
        int c:2;
    };
    

كما يتبين من التحليل الوارد أعلاه، وحقل بت هو في الأساس نوع من الهيكل، ولكن أعضاءها هم من توزيع ثنائي.

ميادين استخدام بعض الشيء

الأعضاء التي تستخدم نفس هيكل وحقل بت، الشكل العام لها:

    位域变量名·位域名

يسمح حقل بت مجموعة متنوعة من الأشكال.

النظر في الأمثلة التالية:

main(){
    struct bs{
        unsigned a:1;
        unsigned b:3;
        unsigned c:4;
    } bit,*pbit;
    bit.a=1;	/* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.b=7;	/* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    bit.c=15;	/* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
    printf("%d,%d,%d\n",bit.a,bit.b,bit.c);	/* 以整型量格式输出三个域的内容 */
    pbit=&bit;	/* 把位域变量 bit 的地址送给指针变量 pbit */
    pbit->a=0;	/* 用指针方式给位域 a 重新赋值,赋为 0 */
    pbit->b&=3;	/* 使用了复合的位运算符 "&=",相当于:pbit->b=pbit->b&3,位域 b 中原有值为 7,与 3 作按位与运算的结果为 3(111&011=011,十进制值为 3) */
    pbit->c|=1;	/* 使用了复合位运算符"|=",相当于:pbit->c=pbit->c|1,其结果为 15 */
    printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);	/* 用指针方式输出了这三个域的值 */
}

ويحدد البرنامج المثال هيكل بكالوريوس حقل بت، حقل ثلاثة بت هو أ، ب، ج. وصف نوع بكالوريوس بت متغير وبكالوريوس مشيرا نوع مؤشر بيتابت متغير. وهذا يمثل حقل بت يمكن أيضا أن تكون المؤشرات المستخدمة.