C에서 int와 static int 데이터 유형의 차이점은 무엇입니까?


최상의 답변

유형을 혼동하지 마십시오 (예 : int)를 선언의 다른 측면 (예 : static와 같은 스토리지 클래스)과 함께 사용합니다.

예 :

int x;

static int y;

xy에는 동일한 유형 인 int ( 데이터 유형이라는 용어)가 있습니다. C와 C ++에서는 덜 일반적으로 사용되지만 잘못된 것은 아닙니다.)

키워드 static는 C에서 세 가지 다른 의미를 갖습니다. 위의 예에서 해당 변수 y는 특정 번역 단위에 “비공개”입니다 (번역 단위는 모든 #include 지시문 다음에 소스 파일로 생각할 수 있으므로 처리되었습니다). 따라서 다른 번역 단위에서 선언 된 y 변수는이 단위와 다릅니다.

다음은 static :

void f() {

static int n = 2;

...

}

이 정적은 변수 nf()의 모든 호출간에 공유되며 f()가 반환 된 후에도 존재합니다. 예를 들어, 그것에 대한 포인터를 반환). n에서 2 으로 초기화는 프로그램 시작 전에 발생합니다. C에서 (C ++에서 f() 처음 호출시). 따라서 두 번째 (및 이후) ​​f()가 호출되면 n는 이전에 있던 값을 유지합니다 (프로그램이 명시 적으로 다시 수정할 때까지 ).

세 번째 의미는 덜 일반적이며 덜 알려져 있습니다.

void g(double x[static 5]) {

...

}

이는 g()는 배열 형성에서 최소 5 개의 double 값 중 첫 번째 값에 대한 포인터로만 호출 할 수 있습니다.

편집 : 로컬에 대한 고정 설명 (Jesse Pollard의 의견 참조).

Answer

Static은 dynamic의 반대입니다. 어? 이는 해당 변수에 할당 된 메모리가 메모리에서 이동하지 않음을 의미합니다. 또한 해당 변수에 액세스하는 함수에 대한 반복적 인 호출에서 변수의 새 섀도 복사본이 생성되지 않습니다. 원래 변수가 사용되며 해당 주소에서 해당 변수에 액세스하는 다른 함수는이를 수정하거나 읽을 수 있습니다. 그 자체로는 전역 변수가 아닙니다. 범위는 정의 된 위치와 방법과 동일합니다. 하지만 그럴 수도 있습니다. 그러나 같은 파일이나 응용 프로그램에 포함 된 이름의 다른 정적 변수를 정의하려고하면 오류가 발생합니다.

간단한 C 추가 함수를 고려하십시오.

int add(int a, int b)

{

static int count = 0;

static int last = 0;

count++;

last = a + b;

printf( "a:\t\%d \t\t b:\t\%d\n", a, b );

printf( "count:\t\%d \t\t last:\t\%d\n", count, last)

return last;

}

count 및 last는 정적으로 정의됩니다. 즉, 여기에 입력 된 값은 추가 할 여러 호출에 걸쳐 유지됩니다. count 및 last는 0으로 초기화되지만 호출 할 때마다 다시 0이되지 않습니다. count와 last의 범위는 함수 add에만 있습니다. 다른 함수와 공유하거나 add 외부에서 액세스 할 수 없으므로이를 얻으려면 함수 내부에서 인쇄해야합니다. 다른 함수는 동일한 개수와 마지막 정적 변수도 가질 수 있으며 상호 작용하지 않습니다.

이제이 테스트 프로그램을보십시오.

#include

static int count = 5;

static int last = 0;

int add(int a, int b)

{

static int count = 0;

static int last = 0;

count++;

last = a + b;

printf( "a:\t\%d \t\t b:\t\%d\n", a, b );

printf( "count:\t\%d \t\t last:\t\%d\n", count, last)

return last;

}

int main(int argc, char**argv )

{

static int count = 10;

static int last = 0;

int i;

int a=1, b=1;

for(i = 0 ; i < count ; i++)

{

a = add(a, b);

b = add(a, last);

last = add(a, b);

}

printf( "a:\t\%d \t\t b:\t\%d\n", a, b );

printf( "count:\t\%d \t\t last:\t\%d\n", count, last);

return 0;

}

3 개는 3 개의 정적 변수 집합이며 마지막입니다. 그들 모두는 분리되어 있습니다. 첫 번째는 전역이며 여기서는 사용되지 않습니다. main에는 로컬 변수가 전역을 음영 처리하기 때문에 사용하는 자체 세트가 있습니다. add에는 동일한 이름의 기본 및 전역을 모두 섀도 잉하는 자체 세트가 있습니다.

정적 함수 정의 은 다른 종류입니다. static이라는 단어는 함수가 정의 된 소스에서 컴파일 된 파일에서만 함수가 표시됨을 나타냅니다. 소스 (“. c”) 파일 또는 헤더 (“. h) 파일이 포함되어 있습니다. 사용중인 개체 파일에 같은 이름 (예 : add, print, error,…)의 함수 버전이 두 개 이상있는 경우에 필요할 수 있으므로 개체 파일을 결합하면 ( ". o") 함께 모듈로 인해 이름 충돌이 발생하지 않습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다