구조(C 프로그래밍 언어)
struct (C programming language)C 프로그래밍 언어의 구조체(및 많은 파생물)는 메모리 블록 내의 하나의 이름으로 물리적으로 그룹화된 변수 목록을 정의하는 복합 데이터 유형(또는 레코드) 선언으로, 단일 포인터 또는 동일한 주소를 반환하는 구조 선언 이름을 통해 다른 변수에 액세스할 수 있습니다.구조 데이터 유형에는 다른 데이터 유형이 포함될 수 있으므로 하드 드라이브 디렉토리 엔트리(파일 길이, 이름, 확장자, 물리적 주소 등) 또는 기타 혼합 유형의 레코드(이름, 주소, 전화, 잔액 등)에 사용됩니다.
C 구조는 일반적으로 워드 길이 경계로 구분(크기)된 연속된 물리적 메모리 블록을 직접 참조합니다.인텔 프로세서의 어셈블러에 따라서는, 같은 이름의 기능에 대응하고 있습니다.연속된 메모리의 블록이기 때문에 구조체 내의 각 필드는 시작부터 일정한 고정 오프셋에 위치합니다.
구조체의 내용은 연속된 메모리에 저장되기 때문에 size of 연산자는 프리미티브에 사용할 수 있는 것과 마찬가지로 특정 유형의 구조체를 저장하는 데 필요한 바이트 수를 얻기 위해 사용해야 합니다.구조에서 특정 필드의 정렬(단어 경계에 관한)은 구현에 고유하며 패딩을 포함할 수 있습니다. 단, 현대의 컴파일러는 일반적으로 다음을 지원합니다.#pragma pack
디렉티브: [1]얼라인먼트에 사용되는 바이트 단위의 크기를 변경합니다.
C++ 언어에서 구조체는 C++ 클래스와 동일하지만 다른 기본 가시성을 가집니다.클래스 멤버는 기본적으로 개인이고 구조 멤버는 기본적으로 공용입니다.
기타 언어
C의 구조 데이터 유형은 ALGOL 68 구조 데이터 [2]유형에서 파생되었습니다.
C의 경우와 마찬가지로 C#의 구조 데이터 타입(Visual Basic의 구조).NET)는 클래스와 유사합니다.이러한 언어에서 구조와 클래스의 가장 큰 차이점은 구조가 함수에 인수로 전달될 때 해당 함수의 구조 수정이 원래 변수에 반영되지 않는다는 것입니다(기준 전달이 [3]사용되지 않는 한).
이것은 C++와는 다릅니다.C++에서는 명시적인 포인터를 사용하여 스택(C#과 유사) 또는 힙 상에서 클래스 또는 구조체를 스태틱하게 할당하거나 동적으로 할당할 수 있습니다.C++에서는 구조체와 클래스의 유일한 차이점은 구조체의 멤버와 기본 클래스가 기본적으로 공개된다는 것입니다.(클래스는 로 정의됩니다.)class
키워드에는 디폴트로 프라이빗멤버와 베이스 클래스가 있습니다).
선언.
C의 구조 선언의 일반적인 구문은 다음과 같습니다.
구조 tag_name { 유형 멤버 1; 유형 멤버 2; /*는 원하는 수의 멤버를 선언하지만 전체 구조 크기를 컴파일러가 알아야 합니다.*/ };
여기서tag_name
는 일부 컨텍스트에서 옵션입니다.
이런...struct
선언은 타입 에일리어스의 typedef 선언 또는 변수의 선언 또는 정의의 컨텍스트에도 표시될 수 있습니다.
유형화된 구조 tag_name { 유형 멤버 1; 유형 멤버 2; } structure_filename(구조물_구조체);
초기화
구조체를 초기화하려면 세 가지 방법이 있습니다.를 위해struct
유형
/* 정수 멤버 x, y */로 구조체를 선언합니다. 구조 포인트 { 인트 x; 인트 y; };
C89 스타일의 이니셜라이저는 연속된 멤버를 지정할 [4]수 있는 경우에 사용됩니다.
/* 유형 포인트의 변수 p를 정의하고 처음 두 멤버를 초기화합니다*/ 구조 포인트 p = { 1, 2 };
연속되지 않거나 순서가 잘못된 멤버 리스트의 경우 지정된 이니셜라이저 스타일을[5] 사용할 수 있습니다.
/* 유형 포인트의 변수 p를 정의하고 지정된 이니셜라이저를 사용하여 멤버를 설정합니다*/ 구조 포인트 p = { .y = 2, .x = 1 };
이니셜라이저를 지정하거나 오브젝트가 스태틱하게 할당되어 있는 경우 생략된 요소는 [6]0으로 초기화됩니다.
구조를 초기화하는 세 번째 방법은 동일한 유형의 기존 객체 값을 복사하는 것입니다.
/* 유형점의 변수 q를 정의하고 멤버를 p */와 같은 값으로 설정합니다. 구조 포인트 q = p;
과제
구조물은 다른 구조물에 지정될 수 있다.컴파일러는 다음을 사용할 수 있습니다.memcpy()
그런 임무를 수행할 수 있습니다.
구조 포인트 { 인트 x; 인트 y; }; 인트 주된(무효) { 구조 포인트 p = { 1, 3 }; /* 초기화 변수 */ 구조 포인트 q; /* 초기화되지 않음*/ q = p; /* 멤버 값을 p에서q로 복사 */ 돌아가다 0; }
구조에 대한 포인터
포인터를 사용하여struct
주소로요.이것은 구조물을 함수에 전달할 때 유용합니다.포인터는 다음 명령어를 사용하여 참조를 해제할 수 있습니다.*
교환입니다.그->
연산자는 포인터를 구조체(왼쪽 피연산자)에 버린 다음 구조체 멤버 값(오른쪽 피연산자)에 액세스합니다.
구조 포인트 { 인트 x; 인트 y; }; 구조 포인트 마이 포인트 = { 3, 7 }; 구조 포인트 *p = &마이 포인트; /* p는 my_point*/에 대한 포인터입니다. (*p).x = 8; /* 구조체의 첫 번째 멤버를 설정합니다*/ p->x = 8; /* 구조체의 첫 번째 부재를 설정하는 동등한 방법 */
「 」를 참조해 주세요.
레퍼런스
- ^ "Struct memory layout in C". Stack Overflow.
- ^ Ritchie, Dennis M. (March 1993). "The Development of the C Language". ACM SIGPLAN Notices. 28 (3): 201–208. doi:10.1145/155360.155580.
The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. The central notion I captured from Algol was a type structure based on atomic types (including structures), composed into arrays, pointers (references), and functions (procedures). Algol 68's concept of unions and casts also had an influence that appeared later.
- ^ "Parameter passing in C#".
- ^ Kelley, Al; Pohl, Ira (2004). A Book On C: Programming in C (Fourth ed.). pp. 418. ISBN 0-201-18399-4.
- ^ "IBM Linux compilers. Initialization of structures and unions".
- ^ "The New C Standard, §6.7.8 Initialization".