구조체 선언Structure Declarations

"구조체 선언"은 형식의 이름을 지정하고 다른 형식이 포함될 수 있는 변수 값의 시퀀스(구조체의 "멤버" 또는 "필드")를 지정합니다.A "structure declaration" names a type and specifies a sequence of variable values (called "members" or "fields" of the structure) that can have different types. "태그"라는 선택적 식별자는 구조체 형식의 이름을 제공하며 구조체 형식에 대한 향후 참조에 사용될 수 있습니다.An optional identifier, called a "tag," gives the name of the structure type and can be used in subsequent references to the structure type. 해당 구조체 형식의 변수는 해당 형식으로 정의된 전체 시퀀스를 보유합니다.A variable of that structure type holds the entire sequence defined by that type. C의 구조체는 다른 언어에서 "레코드"로 알려진 형식과 비슷합니다.Structures in C are similar to the types known as "records" in other languages.

구문Syntax

struct-or-union-specifier:struct-or-union-specifier:
struct-or-union identifier opt{ struct-declaration-list }struct-or-union identifier opt{ struct-declaration-list }

struct-or-union identifierstruct-or-union identifier

struct-or-union:struct-or-union:
tructstruct

unionunion

struct-declaration-list:struct-declaration-list:
struct-declarationstruct-declaration

struct-declaration-list struct-declarationstruct-declaration-list struct-declaration

구조체 콘텐츠는 다음과 같이 정의됩니다.The structure content is defined to be

struct-declaration:struct-declaration:
specifier-qualifier-list struct-declarator-list ;specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:specifier-qualifier-list:
type-specifier specifier-qualifier-list opttype-specifier specifier-qualifier-list opt

type-qualifier specifier-qualifier-list opttype-qualifier specifier-qualifier-list opt

struct-declarator-list:struct-declarator-list:
struct-declaratorstruct-declarator

struct-declarator-list , struct-declaratorstruct-declarator-list , struct-declarator

struct-declarator:struct-declarator:
declarator

구조체 형식의 선언에서는 구조체를 위한 공간이 따로 마련되지 않습니다.The declaration of a structure type does not set aside space for a structure. 이 선언은 구조체 변수의 향후 선언을 위한 템플릿일 뿐입니다.It is only a template for later declarations of structure variables.

이전에 정의된 identifier(태그)를 사용하여 다른 곳에 정의된 구조체 형식을 참조할 수 있습니다.A previously defined identifier (tag) can be used to refer to a structure type defined elsewhere. 이 경우 정의가 표시되는 한 struct-declaration-list를 반복할 수 없습니다.In this case, struct-declaration-list cannot be repeated as long as the definition is visible. 구조체에 대한 포인터의 선언과 구조체 형식의 typedef는 구조체 형식이 정의되기 전에 구조체 태그를 사용할 수 있습니다.Declarations of pointers to structures and typedefs for structure types can use the structure tag before the structure type is defined. 그러나 필드 크기를 실제로 사용하기 전에 구조체 정의가 발생해야 합니다.However, the structure definition must be encountered prior to any actual use of the size of the fields. 이는 불완전한 형식 및 형식 태그 정의입니다.This is an incomplete definition of the type and the type tag. 이 정의가 완전해지려면 형식 정의가 동일한 범위에서 나중에 나타나야 합니다.For this definition to be completed, a type definition must appear later in the same scope.

struct-declaration-list는 구조체 구성원의 형식 및 이름을 지정합니다.The struct-declaration-list specifies the types and names of the structure members. struct-declaration-list 인수에는 하나 이상의 변수 또는 비트 필드 선언이 포함됩니다.A struct-declaration-list argument contains one or more variable or bit-field declarations.

struct-declaration-list에 선언된 각 변수는 구조체 형식의 구성원으로 정의됩니다.Each variable declared in struct-declaration-list is defined as a member of the structure type. struct-declaration-list 내 변수 선언의 형태는 선언에 저장소 클래스 지정자 또는 이니셜라이저를 포함할 수 없다는 점을 제외하고 이 섹션에 설명된 다른 변수 선언과 동일합니다.Variable declarations within struct-declaration-list have the same form as other variable declarations discussed in this section, except that the declarations cannot contain storage-class specifiers or initializers. 구조체 멤버에는 void 형식, 불완전한 형식 또는 함수 형식을 제외한 모든 변수 형식을 포함할 수 있습니다.The structure members can have any variable types except type void, an incomplete type, or a function type.

자신이 나타나는 구조체의 형식을 가지도록 멤버를 선언할 수 없습니다.A member cannot be declared to have the type of the structure in which it appears. 그러나 구조체 형식에 태그가 있는 한 자신이 나타나는 구조체 형식에 대한 포인터로 멤버를 선언할 수 있습니다.However, a member can be declared as a pointer to the structure type in which it appears as long as the structure type has a tag. 이렇게 하면 연결된 구조체 목록을 만들 수 있습니다.This allows you to create linked lists of structures.

구조체는 다른 식별자와 동일한 범위 지정을 따릅니다.Structures follow the same scoping as other identifiers. 구조체 식별자는 표시 유형이 동일한 다른 구조체, 공용 구조체 및 열거형 태그와 달라야 합니다.Structure identifiers must be distinct from other structure, union, and enumeration tags with the same visibility.

struct-declaration-list의 각 struct-declaration은 목록 내에서 고유해야 합니다.Each struct-declaration in a struct-declaration-list must be unique within the list. 그러나 struct-declaration-list에 있는 식별자 이름은 일반 변수 이름이나 다른 구조체 선언 목록의 식별자와 다르지 않아도 됩니다.However, identifier names in a struct-declaration-list do not have to be distinct from ordinary variable names or from identifiers in other structure declaration lists.

중첩된 구조체는 파일 범위 수준에서 선언된 것처럼 액세스할 수도 있습니다.Nested structures can also be accessed as though they were declared at the file-scope level. 예를 들어, 다음과 같은 선언이 있을 경우For example, given this declaration:

struct a  
{  
    int x;  
    struct b  
    {  
      int y;  
    } var2;  
} var1;  

다음 선언은 모두 올바릅니다.these declarations are both legal:

struct a var3;  
struct b var4;  

예제Examples

다음 예제에서는 구조체 선언을 보여 줍니다.These examples illustrate structure declarations:

struct employee   /* Defines a structure variable named temp */  
{  
    char name[20];  
    int id;  
    long class;  
} temp;  

employee 구조체에는 name, idclass라는 세 개의 멤버가 있습니다.The employee structure has three members: name, id, and class. name 구성원은 20개의 요소를 가진 배열이며, idclass는 각각 intlong 형식이 지정된 단순 구성원입니다.The name member is a 20-element array, and id and class are simple members with int and long type, respectively. employee 식별자는 구조체 식별자입니다.The identifier employee is the structure identifier.

struct employee student, faculty, staff;  

다음 예제에서는 student, facultystaff라는 세 가지 구조체 변수를 정의합니다.This example defines three structure variables: student, faculty, and staff. 각 구조체에는 세 가지 멤버로 구성된 동일한 목록이 있습니다.Each structure has the same list of three members. 멤버는 이전 예제에 정의된 구조체 형식인 employee를 갖도록 선언됩니다.The members are declared to have the structure type employee, defined in the previous example.

struct           /* Defines an anonymous struct and a */  
{                /* structure variable named complex  */  
    float x, y;  
} complex;  

complex 구조체에는 float 형식이 지정된 xy라는 두 가지 구성원이 있습니다.The complex structure has two members with float type, x and y. 구조체 형식에 태그가 없으므로 해당 형식은 명명되지 않은 형식 또는 익명 형식입니다.The structure type has no tag and is therefore unnamed or anonymous.

struct sample   /* Defines a structure named x */  
{  
    char c;  
    float *pf;  
    struct sample *next;  
} x;  

구조체의 처음 두 구성원은 char 변수와 float 값에 대한 포인터입니다.The first two members of the structure are a char variable and a pointer to a float value. 세 번째 멤버인 next는 정의되는 구조체 형식에 대한 포인터로 선언됩니다(sample).The third member, next, is declared as a pointer to the structure type being defined (sample).

익명 구조체는 명명된 태그가 필요하지 않은 경우 유용할 수 있습니다.Anonymous structures can be useful when the tag named is not needed. 하나의 선언이 모든 구조체 인스턴스를 정의하는 경우가 그렇습니다.This is the case when one declaration defines all structure instances. 예:For example:

struct  
{  
    int x;  
    int y;  
} mystruct;  

포함 구조체는 종종 익명입니다.Embedded structures are often anonymous.

struct somestruct  
{  
    struct    /* Anonymous structure */  
    {  
        int x, y;  
    } point;  
    int type;  
} w;  

Microsoft 전용Microsoft Specific

컴파일러는 크기가 지정되지 않았거나 크기가 0인 배열을 구조체의 마지막 멤버로 허용합니다.The compiler allows an unsized or zero-sized array as the last member of a structure. 이는 다양한 상황에서 사용할 때 상수 배열의 크기가 다를 경우 유용할 수 있습니다.This can be useful if the size of a constant array differs when used in various situations. 이러한 구조체의 선언은 다음과 같습니다.The declaration of such a structure looks like this:

struct identifier{ set-of-declarations type array-name[ ];};struct identifier{ set-of-declarations type array-name[ ];};

크기가 지정되지 않은 배열은 구조체의 마지막 멤버로만 나타날 수 있습니다.Unsized arrays can appear only as the last member of a structure. 크기가 지정되지 않은 배열 선언을 포함하는 구조체는 바깥쪽 구조체에 멤버를 더 이상 선언하지 않는 한 다른 구조체 내에 중첩될 수 있습니다.Structures containing unsized array declarations can be nested within other structures as long as no further members are declared in any enclosing structures. 구조체에 멤버를 더 선언하는 경우 해당 배열은 허용되지 않습니다.Arrays of such structures are not allowed. sizeof 연산자는 이 형식의 배열이나 배열 자체에 적용될 경우 배열 크기가 0이라고 가정합니다.The sizeof operator, when applied to a variable of this type or to the type itself, assumes 0 for the size of the array.

다른 구조체 또는 공용 구조체의 멤버일 경우 선언자 없이 구조체 선언을 지정할 수도 있습니다.Structure declarations can also be specified without a declarator when they are members of another structure or union. 필드 이름은 바깥쪽 구조체로 승격됩니다.The field names are promoted into the enclosing structure. 예를 들어, 이름이 없는 구조체는 다음과 같습니다.For example, a nameless structure looks like this:

struct s  
{  
    float y;  
    struct  
    {  
        int a, b, c;  
    };  
    char str[10];  
} *p_s;  
.  
.  
.  
p_s->b = 100;  /* A reference to a field in the s structure */  

구조체 참조에 대한 자세한 내용은 구조체 및 공용 구조체 구성원을 참조하세요.See Structure and Union Members for information about structure references.

Microsoft 전용 종료END Microsoft Specific

참고 항목See Also

선언자 및 변수 선언Declarators and Variable Declarations