스칼라 형식 초기화Initializing Scalar Types

스칼라 형식을 초기화할 때 assignment-expression의 값이 변수에 할당됩니다.When initializing scalar types, the value of the assignment-expression is assigned to the variable. 할당에 대한 변환 규칙이 적용됩니다.The conversion rules for assignment apply. (변환 규칙에 대한 자세한 내용은 형식 변환을 참조하세요.)(See Type Conversions for information on conversion rules.)

구문Syntax

declaration:declaration:
declaration-specifiers init-declarator-list opt;declaration-specifiers init-declarator-list opt;

declaration-specifiers:declaration-specifiers:
storage-class-specifier declaration-specifiers optstorage-class-specifier declaration-specifiers opt

type-specifier declaration-specifiers opttype-specifier declaration-specifiers opt

type-qualifier declaration-specifiers opttype-qualifier declaration-specifiers opt

init-declarator-list:init-declarator-list:
init-declaratorinit-declarator

init-declarator-list , init-declaratorinit-declarator-list , init-declarator

init-declarator:init-declarator:
declaratordeclarator

declarator = initializer /* 스칼라 초기화용 */declarator = initializer /* For scalar initialization */

initializer:initializer:
assignment-expressionassignment-expression

다음 규칙에 따라 모든 형식의 변수를 초기화할 수 있습니다.You can initialize variables of any type, provided that you obey the following rules:

  • 파일 범위 수준에서 선언된 변수를 초기화할 수 있습니다.Variables declared at the file-scope level can be initialized. 외부 수준에서 변수를 명시적으로 초기화하지 않는 경우 해당 변수는 기본적으로 0으로 초기화됩니다.If you do not explicitly initialize a variable at the external level, it is initialized to 0 by default.

  • 상수 식을 사용하면 static storage-class-specifier로 선언된 모든 전역 변수를 초기화할 수 있습니다.A constant expression can be used to initialize any global variable declared with the static storage-class-specifier. static으로 선언될 변수는 프로그램 실행이 시작될 때 초기화됩니다.Variables declared to be static are initialized when program execution begins. 전역 static 변수를 명시적으로 초기화하지 않는 경우 해당 변수는 기본적으로 0으로 초기화되고 포인터 형식을 갖는 모든 멤버에 null 포인터가 할당됩니다.If you do not explicitly initialize a global static variable, it is initialized to 0 by default, and every member that has pointer type is assigned a null pointer.

  • auto 또는 register 저장소 클래스 지정자로 선언된 변수는 해당 변수가 선언된 블록에 실행 제어가 전달될 때마다 초기화됩니다.Variables declared with the auto or register storage-class specifier are initialized each time execution control passes to the block in which they are declared. auto 또는 register 변수의 선언에서 이니셜라이저를 생략하는 경우 변수의 초기 값이 정의되지 않습니다.If you omit an initializer from the declaration of an auto or register variable, the initial value of the variable is undefined. 자동 및 레지스터 값의 경우 이니셜라이저는 상수가 되는 것으로 제한되지 않습니다. 따라서 이니셜라이저는 함수가 호출되어도 이전에 정의된 값을 포함하는 모든 식일 수 있습니다.For automatic and register values, the initializer is not restricted to being a constant; it can be any expression involving previously defined values, even function calls.

  • 외부 변수 선언 및 모든 static 변수에 대한 초기 값은 외부 또는 내부인지에 상관없이 상수 식이어야 합니다.The initial values for external variable declarations and for all static variables, whether external or internal, must be constant expressions. 자세한 내용은 상수 식을 참조하세요. 외부 선언 또는 정적 변수의 주소는 상수이므로 이러한 주소를 사용하면 내부적으로 선언된 static 포인터 변수를 초기화할 수 있습니다.(For more information, see Constant Expressions.) Since the address of any externally declared or static variable is constant, it can be used to initialize an internally declared static pointer variable. 그러나 auto 변수의 주소는 블록의 각 실행에 대해 서로 다를 수 있으며 정적 이니셜라이저로 사용될 수 없습니다.However, the address of an auto variable cannot be used as a static initializer because it may be different for each execution of the block. 상수 또는 변수 값을 사용하여 autoregister 변수를 초기화할 수 있습니다.You can use either constant or variable values to initialize auto and register variables.

  • 식별자 선언에 블록 범위가 있으며 식별자에 외부 링크가 있는 경우 선언이 초기화를 가질 수 없습니다.If the declaration of an identifier has block scope, and the identifier has external linkage, the declaration cannot have an initialization.

예제Examples

다음 예제에서는 초기화를 보여 줍니다.The following examples illustrate initializations:

int x = 10;   

정수 변수 x는 상수 식 10으로 초기화됩니다.The integer variable x is initialized to the constant expression 10.

register int *px = 0;  

px 포인터는 0으로 초기화되어 "null" 포인터를 생성합니다.The pointer px is initialized to 0, producing a "null" pointer.

const int c = (3 * 1024);  

이 예제에서는 상수 식 (3 * 1024)를 사용하여 cconst 키워드 때문에 수정될 수 없는 상수 값으로 초기화합니다.This example uses a constant expression (3 * 1024) to initialize c to a constant value that cannot be modified because of the const keyword.

int *b = &x;  

이 문은 다른 변수 b의 주소와 함께 x 포인터를 초기화합니다.This statement initializes the pointer b with the address of another variable, x.

int *const a = &z;  

a 포인터는 z라는 변수의 주소와 함께 초기화됩니다.The pointer a is initialized with the address of a variable named z. 그러나 이 포인터는 const로 지정되므로 a 변수는 초기화할 수만 있으며 수정할 수 없습니다.However, since it is specified to be a const, the variable a can only be initialized, never modified. 항상 동일한 위치를 가리킵니다.It always points to the same location.

int GLOBAL ;  

int function( void )  
{  
    int LOCAL ;  
    static int *lp = &LOCAL;   /* Illegal initialization */  
    static int *gp = &GLOBAL;  /* Legal initialization   */  
    register int *rp = &LOCAL; /* Legal initialization   */  
}  

전역 변수 GLOBAL은 외부 수준에서 선언되므로 전역 수명을 가집니다.The global variable GLOBAL is declared at the external level, so it has global lifetime. 지역 변수 LOCALauto 저장소 클래스를 가지며 선언된 함수를 실행하는 동안에만 주소를 가집니다.The local variable LOCAL has auto storage class and only has an address during the execution of the function in which it is declared. 따라서 LOCAL의 주소와 함께 static 포인터 변수 lp를 초기화할 수 없습니다.Therefore, attempting to initialize the static pointer variable lp with the address of LOCAL is not permitted. GLOBAL의 주소가 항상 동일하므로 static 포인터 변수 gp는 해당 주소로 초기화될 수 있습니다.The static pointer variable gp can be initialized to the address of GLOBAL because that address is always the same. 마찬가지로 *rp는 지역 변수이며 비상수 이니셜라이저를 가질 수 있으므로 rp는 초기화될 수 있습니다.Similarly, *rp can be initialized because rp is a local variable and can have a nonconstant initializer. 블록을 입력할 때마다 LOCAL에 새 주소가 지정되며 이 주소는 rp에 할당됩니다.Each time the block is entered, LOCAL has a new address, which is then assigned to rp.

참고 항목See Also

초기화Initialization