Latest web development tutorials
×

C หลักสูตร

C กวดวิชาภาษา C แนะนำโดยย่อ C การตั้งค่าสภาพแวดล้อม C โครงสร้างหลักสูตร C ไวยากรณ์พื้นฐาน C ชนิดข้อมูล C ตัวแปร C คงที่ C ประเภทการจัดเก็บ C ผู้ประกอบการ C ผู้พิพากษา C การไหลเวียน C ฟังก์ชัน C การกำหนดขอบเขตกฎระเบียบ C แถว C ชี้ C เชือก C โครงสร้าง C สหภาพ C ฟิลด์บิต C typedef C อินพุตและเอาต์พุต C การอ่านออกเขียนเอกสาร C preprocessor C ส่วนหัว C ปลดเปลื้อง C จัดการข้อผิดพลาด C recursion C พารามิเตอร์ตัวแปร C จัดการหน่วยความจำ C บรรทัดคำสั่ง C คลาสสิก 100 ราย

C ห้องสมุดมาตรฐาน

C ห้องสมุดมาตรฐาน - คู่มืออ้างอิง C ห้องสมุดมาตรฐาน - <assert.h> C ห้องสมุดมาตรฐาน - <ctype.h> C ห้องสมุดมาตรฐาน - <errno.h> C ห้องสมุดมาตรฐาน - <float.h> C ห้องสมุดมาตรฐาน - <limits.h> C ห้องสมุดมาตรฐาน - <locale.h> C ห้องสมุดมาตรฐาน - <math.h> C ห้องสมุดมาตรฐาน - <setjmp.h> C ห้องสมุดมาตรฐาน - <signal.h> C ห้องสมุดมาตรฐาน - <stdarg.h> C ห้องสมุดมาตรฐาน - <stddef.h> C ห้องสมุดมาตรฐาน - <stdio.h> C ห้องสมุดมาตรฐาน - <stdlib.h> C ห้องสมุดมาตรฐาน - <string.h> C ห้องสมุดมาตรฐาน - <time.h>

โครงสร้าง 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 ตัวแปร นี้แสดงให้เห็นฟิลด์บิตยังสามารถเป็นตัวชี้มือสอง