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. 이 비트 필드가 사용될 수있다 포인터를 나타낸다.