산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C - 구조

배열을 사용하면 같은 종류의 여러 데이터 항목을 보유할 수 있는 변수 유형을 정의할 수 있습니다. 유사하게 구조 다른 종류의 데이터 항목을 결합할 수 있는 C에서 사용할 수 있는 또 다른 사용자 정의 데이터 유형입니다.

구조는 레코드를 나타내는 데 사용됩니다. 도서관에서 책을 추적하고 싶다고 가정해 봅시다. 각 책에 대한 다음 속성을 추적할 수 있습니다. −

구조 정의

구조를 정의하려면 struct를 사용해야 합니다. 성명. struct 문은 둘 이상의 멤버가 있는 새 데이터 형식을 정의합니다. struct 문의 형식은 다음과 같습니다 -

struct [structure tag] {

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

구조 태그 선택적이며 각 멤버 정의는 int i와 같은 일반 변수 정의입니다. 또는 float f; 또는 다른 유효한 변수 정의. 구조 정의 끝에서 마지막 세미콜론 앞에 하나 이상의 구조 변수를 지정할 수 있지만 선택 사항입니다. Book 구조를 선언하는 방법은 다음과 같습니다. -

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;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   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);

   /* print Book2 info */
   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;
};

/* function declaration */
void printBook( struct Books book );

int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info */
   printBook( Book1 );

   /* Print Book2 info */
   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;
};

/* function declaration */
void printBook( struct Books *book );
int main( ) {

   struct Books Book1;        /* Declare Book1 of type Book */
   struct Books Book2;        /* Declare Book2 of type Book */
 
   /* book 1 specification */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;

   /* book 2 specification */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* print Book1 info by passing address of Book1 */
   printBook( &Book1 );

   /* print Book2 info by passing address of 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

비트 필드

비트 필드를 사용하면 구조에서 데이터를 패킹할 수 있습니다. 이것은 메모리나 데이터 저장이 중요할 때 특히 유용합니다. 전형적인 예는 다음과 같습니다 -

C를 사용하면 변수 뒤에 :bit length를 넣어 구조 정의에서 이를 수행할 수 있습니다. 예를 들어 -

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는 6개의 멤버를 포함합니다:4개의 1비트 플래그 f1..f3, 4비트 유형 및 9비트 my_int.

C는 필드의 최대 길이가 컴퓨터의 정수 단어 길이보다 작거나 같으면 위의 비트 필드를 가능한 한 압축하여 자동으로 압축합니다. 그렇지 않은 경우 일부 컴파일러는 필드에 대한 메모리 겹침을 허용하는 반면 다른 컴파일러는 다음 단어에 다음 필드를 저장할 수 있습니다.


C 언어

  1. C++의 구조 및 클래스
  2. 세마포어:유틸리티 서비스 및 데이터 구조
  3. 도서 리뷰:디지털화 또는 사망
  4. 매우 인간적인 미래
  5. 차세대 자기 데이터 저장 기술
  6. 2021년에 읽어야 할 최고의 프로그래밍 책 17권
  7. 자바 - 데이터 구조
  8. C - 형식 정의
  9. C++ 데이터 구조
  10. C# - 구조