โครงสร้าง C
Cช่วยให้คุณกำหนดอาร์เรย์ของชนิดเดียวกันสามารถเก็บไว้ในรายการข้อมูลตัวแปรให้โครงสร้างการเขียนโปรแกรม C ที่ผู้ใช้กำหนดอีกประเภทข้อมูลที่มีอยู่ซึ่งจะช่วยให้คุณสามารถจัดเก็บแตกต่างกันของรายการข้อมูล
โครงสร้างใช้แทนบันทึกสมมติว่าคุณต้องการติดตามหนังสือห้องสมุดแบบไดนามิกคุณอาจจำเป็นต้องติดตามของหนังสือแต่ละเล่มคุณสมบัติต่อไปนี้:
- ชื่อเรื่อง
- ผู้เขียน
- เรื่อง
- รหัสหนังสือ
โครงสร้างความหมาย
เพื่อกำหนดโครงสร้างที่คุณจะต้องใช้คำสั่งที่ structคำสั่ง struct กำหนดชนิดข้อมูลใหม่ที่ประกอบด้วยส่วนใหญ่ของสมาชิกคำสั่งรูปแบบ struct จะเป็นดังนี้:
struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];
แท็กโครงสร้างเป็นตัวเลือกความละเอียดสมาชิกทุกคนคือการกำหนดมาตรฐานของตัวแปรเช่น int i หรือลอย F หรือนิยามตัวแปรอื่น ๆ ที่ถูกต้องในตอนท้ายของโครงสร้างที่กำหนดไว้ครั้งหนึ่งก่อนที่จะอัฒภาคคุณสามารถระบุหนึ่งหรือมากกว่าหนึ่งตัวแปรที่มีโครงสร้างซึ่งจะเป็นตัวเลือก นี่คือโครงสร้างการประกาศหนังสือโดย:
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
การเข้าถึงโครงสร้างสมาชิก
เพื่อที่จะเข้าถึงสมาชิกของโครงสร้างที่เราจะใช้ประกอบการเข้าถึงสมาชิก (.)ผู้ประกอบการเข้าถึงสมาชิกเป็นโครงสร้างระยะเวลาชื่อตัวแปรและโครงสร้างของสมาชิกของเราต้องการเข้าถึงระหว่างคุณสามารถกำหนดประเภทของโครงสร้างตัวแปรโดยใช้คำหลักที่ structตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งานของโครงสร้าง:
#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 บิตฟิลด์ฟิลด์บิต B คิดเป็นสองในบัญชีสำหรับ 6 บิตฟิลด์ C
ลองดูที่ตัวอย่าง:
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 รวมถึงหกสมาชิก: สี่ 1 บิตระบุ f1..f4 ชนิด 4 บิตและ my_int 9 บิต
สำหรับความหมายของข้อมูลบิตมีคำแนะนำต่อไปนี้:
ฟิลด์บิตต้องเก็บไว้ในไบต์เดียวไม่ครอบคลุมไบต์ที่สอง เช่นเมื่อไบต์พื้นที่ไม่เหลือพอที่จะเก็บโดเมนอื่นที่ควรจะเป็นหน่วยเก็บข้อมูลต่อไปจากสนามบิต นอกจากนี้ยังสามารถจงใจทานโดเมนจากหน่วยต่อไป ตัวอย่างเช่น:
struct bs{ unsigned a:4; unsigned :4; /* 空域 */ unsigned b:4; /* 从下一单元开始存放 */ unsigned c:4 }
ในความหมายข้อมูลบิตนี้สี่บิตไบต์แรกหลังจากสี่กล่าวว่าพวกเขาไม่ได้ใช้ในการกรอก 0, B จากไบต์สองครอบครอง 4, C ตรงบริเวณสี่
- เนื่องจากฟิลด์บิตไม่ได้รับอนุญาตทั้งสองไบต์ดังนั้นความยาวของสนามบิตที่ไม่สามารถจะมีขนาดใหญ่กว่าความยาวไบต์เดียวคือไม่เกิน 8 ไบนารี ถ้าความยาวสูงสุดคือมากกว่าความยาวของคำคอมพิวเตอร์ทั้งคอมไพเลอร์บางคนอาจช่วยให้หน่วยความจำภูมิภาคทับซ้อนและคอมไพเลอร์บางคนอาจใส่มากกว่าส่วนหนึ่งของการจัดเก็บข้อมูลประสิทธิภาพของคำถัดไป
เขตบิตสามารถฟิลด์บิตชื่อแล้วมันจะถูกใช้เป็นเติมหรือการปรับตำแหน่งเท่านั้น ฟิลด์บิตชื่อไม่สามารถใช้ ตัวอย่างเช่น:
struct k{ int a:1; int :2; /* 该 2 位不能使用 */ int b:3; int c:2; };
ที่สามารถเห็นได้จากการวิเคราะห์ข้างต้นข้อมูลบิตเป็นหลักประเภทของโครงสร้าง แต่สมาชิกโดยกระจาย binary
เขตการใช้บิต
สมาชิกที่ใช้โครงสร้างเดียวกันและเขตบิตรูปแบบทั่วไปที่:
位域变量名·位域名
ฟิลด์บิตช่วยให้ความหลากหลายของรูปแบบ
พิจารณาตัวอย่างต่อไปนี้:
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); /* 用指针方式输出了这三个域的值 */ }
โปรแกรมตัวอย่างเช่นกำหนดบิตข้อมูลโครงสร้าง BS ฟิลด์สามบิตคือ A, B, C รายละเอียดของประเภทของ BS บิตตัวแปรและ BS ชี้ประเภทตัวชี้ Pbit ตัวแปร นี้แสดงให้เห็นฟิลด์บิตยังสามารถเป็นตัวชี้มือสอง