C 언어 구조 및 결합 자세히 설명하기

4408 단어
구조체 기초
집합 유형 - 하나의 단독 데이터를 동시에 저장할 수 있으며 C 언어는 두 가지 집합 데이터 유형의 수조와 구조를 제공한다.배열과 구조의 차이점:
4
  • 수조는 같은 유형의 데이터의 집합이고 구조는 서로 다른 유형의 데이터의 집합이다

  • 4
  • 수조의 원소 길이가 같기 때문에 아래 첨자로 접근할 수 있고 구조 구성원의 길이가 다르기 때문에 이름으로만 접근할 수 있으며 아래 첨자를 통해 접근할 수 없다

  • 4
  • 그룹 이름은 표현식에서 사용할 때 하나의 지침으로 간주되고 구조체 변수는 표현식에서 사용할 때 하나의 지침으로 간주되지 않는다

  • 우리는 구조를 가리키는 바늘을 설명하고 구조 변수의 주소와 구조 그룹을 설명할 수 있다.
    구조체 변수의 성명
    struct tag 
    {
      number_list;
    } variable_list;
    

    그 중에서 태그는 생략할 수 있지만, 이렇게 하면 하나의 구조체 변수만 성명할 수 있으며, 태그는 여러 개의 같은 구조체 변수를 성명하는 데 사용된다.
    탭은 여러 개의 성명이 같은 구성원 목록을 사용하고 같은 유형의 구조를 만들 수 있도록 합니다. 탭은 미래 변수를 성명하는 데 사용할 패턴만 표시합니다.
    struct stInfo
    {
      int age ;
     char name[];
      int classNo; 
    }
      /*        stInfo           ,            */
    struct stInfo info; //       info
    struct stInfo *info1; //            
    struct stInfo inf2[]; //          
      /*info info1 info2           */
    

    선언 구조에서 사용할 수 있는 또 다른 팁은 type을 사용하여 다음 예와 같이 새 유형을 만드는 것입니다.
    type struct
    {
      int a;
      char b;
      float c;
    } stSimple; //        (;) 
    
    /*stSimple      ,        */
    stSimple x; 
    stSimple y[];
    stSimple *z;
    

    구조체 구성원
    구조체 안에서는 어떤 유형의 변수도 구조체의 구성원으로 성명할 수 있다. 예를 들어 구조, 체 연합체 등이다.
    struct COMPLEX
    {
      float f;
      int a [20];
      long *lp;
      struct stSimple s;
      struct stSimple sa[20];
      struct stSimple *sp;
    }
    

    하나의 구조체의 구성원 이름은 다른 구조의 구성원 이름과 같기 때문에 이 구조의 구성원 a는 struct st Simple의 구성원 a와 충돌하지 않습니다.
    구조체 구성원 변수의 직접 접근
    구조체 변수의 구성원은 점 조작부호(.)를 통해점 조작부호는 두 개의 조작수를 받아들인다. 왼쪽 조작수는 구조체 변수의 이름이고 오른쪽 조작수는 구조체 변수의 구성원이며 점 조작부호는 왼쪽에서 오른쪽으로*의 결합성이다.
    struct COMPLEX comp;
    comp.f; //    f
    comp.s.a //         a
    comp.a[4] //         
    comp sa[4].c //         
    

    구조체 구성원의 간접 접근
    구조체 변수를 가리키는 바늘이 있으면 이 바늘로 구조체 구성원에 접근할 때 구조체 구성원의 간접 접근이다.  구조체 구성원의 간접 접근은 화살표 조작부호(->)를 사용한다. 이 조작부호의 왼쪽 조작수는 구조체를 가리키는 지침이고 오른쪽 조작수는 구조체 구성원이다.
    struct COMPLEX *compp;
    compp->f;
    compp->a[1];
    compp->s.a;
    compp->sa[4].c;
    compp->sp->b;
    

    구조체 변수의 자체 인용
    먼저 구조체가 위법적으로 스스로 인용한 예를 보아라.
    struct SELF_RIF1
    {
      int a;
      struct  SELF_RIF1 b; //       
      int c;
    }
    

    이런 인용은 위법이다. 왜냐하면 구성원 b는 또 다른 완전한 구조체이고 그 내부에는 자신의 구성원 b도 포함되어 있기 때문에 이렇게 순환이 무궁무진하다.  다시 합법적인 구조체 인용
    struct SELF_RIF1
    {
      int a;
      struct  SELF_RIF1 *b; //       
      int c;
    }
    

    이 성명과 앞의 성명의 차이는 b가 현재 하나의 지침이지 하나의 구조가 아니라는 데 있다.컴파일러는 구조의 길이가 확정되기 전에 이미 지침의 길이를 알고 있기 때문에 이런 유형의 인용은 합법적이다.
    사실상 하나의 구조 내부에는 이 구조 자체를 가리키는 지침이 포함되어 있는데 사실상 가리키는 것은 같은 유형의 서로 다른 구조이다. 체인 시계와 나무는 모두 이런 기교로 이루어진 것이다. 모든 구조는 체인 시계의 다음 요소나 나무의 다음 부분을 가리킨다.
    구조의 초기화
    구조의 초기화 방식은 그룹의 초기화와 유사하다. 한 쌍의 괄호 안에 위치하고 쉼표로 구분된 초기 목록은 구조의 각 구성원의 초기화에 사용할 수 있으며, 이 값들은 구조 구성원의 순서에 따라 쓰여진다.초기 목록의 값이 충분하지 않으면 나머지 구조 멤버는 기본값을 사용하여 초기화됩니다.   구조에 수조와 구조 구성원이 포함되면 그 초기화 방식은 다차원 수조의 초기화와 유사하다.
    struct INIT_EX
    {
      int a;
      short b[10];
      Simple c;
    } x = {
      10,
      {1,2,3,4,5},
     { 25,'x',1.9}
    };
    

    함수 매개 변수로서의 구조
    구조는 하나의 표량으로 다른 표량이 사용할 수 있는 모든 장소에 사용할 수 있기 때문에 구조를 하나의 매개 변수로 함수에 전달하는 것은 합법적이다.
    함수에 구조를 가리키는 바늘을 전달하는 효율은 함수에 전체 구조를 전달하는 것보다 훨씬 크다.
    typedef struct
    {
      char product[PRODUCT_SIZE];
      int quantity;
      float unit_price;
      float total_amount;
    } Transaction;
    /            /
    void print_receipt(Transaction trans)
    {
      ...
    }
    /              /
    void print_receipt(Transaction *trans)
    {
      ...
    }
    /                   /
     Transaction current_trans;
      print_receipt(current_trans);  //              
      print_receipt(&current_trans); //                
    

    함수로 구조를 가리키는 바늘을 전달하는 것은 함수로 전체 구조를 전달하는 것보다 효율이 높고 구조가 클수록 이런 장점이 뚜렷하다.
    콤비네이션
    연합은 구조와 비슷하지만 행동과 구조는 다르다.연합된 모든 구성원은 메모리의 같은 위치를 인용한다.
     union 
    {
      float f;
      int i;
    } fi;
    

    부동점과 정형이 모두 32비트인 기계에서 변수fi는 메모리에서 32비트의 글자만 차지하고 구성원 f가 사용되면 이 글자는 부동점 값으로 접근하며 구성원 i가 사용되면 이 글자는 정형 값으로 접근한다.
    연합은 어느 순간에 한 명의 구성원만 방문할 수 있다. 만약에 연합 구성원의 길이가 다르면 연합의 길이가 가장 긴 구성원의 길이이다. 만약 길이가 매우 크면 연합에 서로 다른 구성원을 가리키는 지침을 저장할 수 있다. 직접 구성원 자체를 저장하는 것이 아니라 연합의 길이를 저장할 수 있다. 모든 지침의 길이는 같다.
    통합 초기화
    결합 변수는 초기화할 수 있지만 이 값은 결합의 첫 번째 구성원의 유형이어야 하며, 예를 들어 괄호 안에 있어야 한다.
    union
    {
      int a;
      float f;
      char c[4];
    } x = {5};
    

    우리는 이 종류의 변수를 부동점수나 문자값으로 초기화할 수 없습니다. 만약 초기값이 다른 종류라면, 이것은 정형값으로 변환되어 x.a에 값을 부여합니다.

    좋은 웹페이지 즐겨찾기