Latest web development tutorials

C 구조

C는 동일한 유형의 어레이는 가변 데이터 항목에 저장 될 수있는 정의 할 수 있으며,구조는 데이터 아이템의 종류를 저장할 수있는 다른 사용자 정의 데이터 타입 가능한 C 프로그래밍이다.

구조, 레코드를 나타내는 데 사용되는 동적 라이브러리 책을 추적 할 가정, 각 책에는 다음과 같은 속성을 추적해야 할 수 있습니다 :

  • 표제
  • 저자
  • 제목
  • 책 ID

정의 구조

구조를 정의하기 위해, 당신은구조체 문을 사용해야합니다.구조체 문장은 다음과 같이 복수의 부재를 포함하는 새로운 데이터 유형, 포맷 구조체 문이 정의

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

구조 태그는 선택 사항이며,모든 구성원의 정의는 내가 int로서 변수의 표준 정의입니다 또는 F를 떠 또는 다른 유효한 변수 정의. 정의 구조의 끝에서, 세미콜론 전에 마지막 하나는 선택적이며 하나 또는 그 이상의 구조적 변수들을 지정할 수있다. 여기에 구조 선언 책으로는 다음과 같습니다

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;
};

마찬가지로 비트 필드 설명 변수 및 구조 변수를 설명했다. 첫 번째 정의 설명과 지침이 직접 세 가지 방법으로이를 설명 정의 후 사용하실 수 있습니다. 예를 들면 :

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

기지국 가변 데이터 설명 2 바이트의 총. 어느 비트 필드 b는 6 비트 필드 C를 차지, 두를 차지 8 비트 필드를 차지했다.

예제를 보자 :

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;

네 개의 1 비트 식별자 f1..f4, 4 비트 입력 및 9 비트 my_int : 여기서, packed_struct 여섯 부재를 포함한다.

비트 필드의 정의는 다음 지시 사항이 있습니다 :

  • 비트 필드는 2 바이트를 확장 할 단일 바이트에 저장되어야한다. 바이트가 아닌 경우에 충분한 공간이 다른 영역을 저장하는 왼쪽 이와 같이, 비트 필드로부터 다음 저장 부이어야한다. 또한 의도적으로 다음 장치에서 도메인을 검토 할 수 있습니다. 예를 들면 :

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

    이 비트 필드 정의에서, 네 후 첫 번째 바이트의 4 개의 비트들이 4 점유 번째 바이트에서 B, 0 채우기 위해 사용하지 않은 것을, C는 네를 차지한다.

  • 비트 필드는 2 바이트에 걸쳐 허용되지 않으므로 비트 필드의 길이는 1 바이트 길이보다 크게 할 수 없기 때문에, 즉, 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);	/* 用指针方式输出了这三个域的值 */
}

예제 프로그램은 비트 필드 구조 기지국은 세 개의 비트 필드가 A, B, C 인 정의한다. 가변 비트 BS의 유형에 대한 설명 및 포인팅 기지국 형 포인터 변수 pbit. 이 비트 필드가 사용될 수있다 포인터를 나타낸다.