C 언어의 변수 역할 영역,링크 와 저장 기간 의 의 미 를 깊이 분석 합 니 다.

c 에서 변 수 는 세 가지 성질 이 있 습 니 다.
1.저장 기한:변수의 저장 기한 은 변수 가 사용 하 는 메모리 공간 이 언제 방출 되 는 지 결정 합 니 다.동적 저장 기한 을 가 진 변 수 는 소속 프로그램 블록 이 실 행 될 때 메모리 공간 을 얻 고 끝 날 때 메모리 공간 을 방출 합 니 다.정적 저장 기한 이 있 는 변 수 는 프로그램 이 실행 되 는 동안 메모리 공간 을 차지 합 니 다.
2.역할 영역:변 수 는 블록 역할 영역 도 있 고 파일 역할 영역 도 있 습 니 다.제1장 첫 번 째 그림 과 결합 하면 블록 역할 영역 이 특정한 프로그램 블록 에서 작용 하고 파일 역할 영역 은 전체 c 파일 에서 작용 한 다 는 것 을 알 수 있 습 니 다.
3.링크:링크 는 각 파일 간 의 관계 로 내부 링크 를 가 진 변 수 는 본 파일 에서 만 역할 을 하고 외부 링크 를 가 진 변 수 는 서로 다른 파일 에서 역할 을 할 수 있 습 니 다.링크 가 없 는 변 수 는 한 파일 의 한 함수 에서 만 작 동 합 니 다.
在这里插入图片描述
C 변수 역할 영역,링크 와 저장 기간 의 의미
잘못된 정의 C 언어 변수의 역할 영역,링크 와 저장 영역 은 어느 정도 에 프로그램의 디자인 에 직접적인 영향 을 줄 수 있 습 니 다.우 리 는 이 박문 을 통 해 C 변 수 를 정확 하고 합 리 적 으로 정의 하 는 방법 을 소개 합 니 다.
C 변 수 를 정의 하 는 것 부터 C 고수 가 됩 니 다.
1.기본 용어   
1.1 대상 이 무엇 인지(object)
       C 언어의 대상 의 의 미 는 C++와 완전히 다르다.C 언어의 대상 은 데 이 터 를 저장 하 는 메모 리 를 가리킨다.대상 은 하나 이상 의 값 을 저장 할 수 있 습 니 다.한 대상 은 실제 값 을 저장 하지 않 았 을 수도 있 지만 적당 한 값 을 저장 할 때 반드시 해당 하 는 크기 를 가 집 니 다.대상 은 프로그램의 실행 기간 에 존재 할 수도 있 고 그 함수 의 실행 기간 에 만 존재 할 수도 있다.
  1.2 식별 자(identifier)가 무엇 입 니까?
       식별 자 는 하나의 이름 으로 이 식별 자 를 통 해 대상 의 내용 을 수정 할 수 있다.식별 자 는 소스 코드 의 다 중 파일 에서 공유 할 수 있 고 특정한 파일 에 사용 할 수 있 는 임 의 함수 에서 만 사용 할 수 있 으 며 심지어 함수 중의 일부분 에서 만 사용 할 수 있다.
예 를 들 어 int 형 변수 point 를 정의 합 니 다.

int point;
대상 과 식별 자의 관 계 는 다음 과 같다.
在这里插入图片描述
2.역할 영역,링크 와 저장 기간 의 3 자 관계
       저장 기간 은 대상 을 설명 하 는 데 쓰 인 다.저장 기간 이란 대상 이 메모리 에 얼마나 오래 보관 할 수 있 는 지 를 말한다.
       식별 자 는 대상 에 접근 하 는 데 사 용 됩 니 다.역할 영역(scope)과 링크(linkage)를 사용 하여 식별 자 를 설명 합 니 다.식별 자의 역할 영역 과 링크 는 프로그램의 어떤 부분 을 사용 할 수 있 는 지 보 여 줍 니 다.
3.역할 영역 에 대한 상세 한 설명
역할 도 메 인 설명 프로그램 에서 식별 자 에 접근 할 수 있 는 영역
하나의 C 변수의 역할 영역 은 블록 역할 영역,함수 역할 영역,함수 원형 역할 영역 과 파일 역할 영역 일 수 있 습 니 다.다음은 모든 역할 영역의 의 미 를 상세 하 게 설명 하 겠 습 니 다.
  3.1 블록 역할 영역
       블록 은 괄호 로 묶 은 코드 영역 으로 블록 에 있 는 변 수 를 블록 역할 영역 으로 정의 합 니 다.블록 역할 영역 변수의 보 이 는 범 위 는 정의 에서 이 정 의 를 포함 하 는 블록 의 끝 입 니 다.
       또한 함수 의 형식 매개 변 수 는 함수 의 왼쪽 괄호 앞 에 있 지만 블록 역할 도 메 인 을 가지 고 함수 체 라 는 블록 에 속 합 니 다.

int Star_CongShanRuoShui(int user_id)
{
	int res = 0;
	......
	return 
}
👆위 코드 중"user"id"와"res"는 모두 블록 역할 영역 을 가지 고 있 습 니 다.

int Star_CongShanRuoShui(int user_id[] , int n)
{
	int res = 0;
	for(int i=0;i<n;++i)
	{
		......
		int q=0;   //q      
		
		......
	}              //q      
	......
	return 
}
👆위의 code 에서 변수"q"의 역할 영역 은 for 순환 순환 체 에 만 제 한 됩 니 다.
    3.1.1 블록 개념의 확장
       C99 는 블록 개념 을 for 순환,while 순환,do while 순환 과 if 문 구 를 포함 하여 제어 하 는 코드 로 확장 합 니 다.이 코드 들 이 괄호 로 묶 이지 않 아 도 블록 의 일부분 이 고 아래 의 code 라 고 할 수 있 습 니 다.👇

#include<stdio.h>

int main()
{
	int Star_CSRS = 8;
	printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p
", Star_CSRS ,&Star_CSRS); for(int Star_CSRS=0;Star_CSRS<4;++Star_CSRS) { printf("[for index] value of Star_CSRS is %d | address of Star_CSRS:%p
", Star_CSRS ,&Star_CSRS); int Star_CSRS = 6; printf("[for] value of Star_CSRS is %d | address of Star_CSRS:%p
", Star_CSRS ,&Star_CSRS); ++Star_CSRS; } printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p
", Star_CSRS ,&Star_CSRS); return 0; }
출력 은 다음 과 같 습 니 다:
在这里插入图片描述
  • main 에서 변 수 를 정 의 했 습 니 다 StarCSRS,for 순환 헤드 에서 정의 하 는 변수 StarCSRS 는 main 의 Star 를 숨 겼 습 니 다.CSRS
  • for 의 순환 체 중의 StarCSRS 는 for 순환 헤드 의 Star 를 또 숨 겼 습 니 다.CSRS
  • 在这里插入图片描述   
     3.2 함수 역할 영역
           함수 역할 영역의 개념 은 goto 문장의 라벨 에 만 한 정 됩 니 다.이것 은 하나의 태그 가 함수 의 내부 블록 에 처음 나타 나 더 라 도 그 역할 영역 은 전체 함수상세 한 것 은 나의 이 박문 을 참고 할 수 있다.로 연장 된다 는 것 을 의미한다.
    3.3 함수 원형 작용 영역
           함수 원형 에 사용 할 형 삼 변수 이름 은 다음 과 같 습 니 다.
    
    int Star_CongShanRuoShui(int user_id);
           함수 원형 작용 역 의 범 위 는 형 삼 정의 에서 원형 성명 으로 끝난다.함수 원형 중의 형 삼 컴 파일 러 는 형 삼 유형 에 만 관심 을 가지 고 구체 적 인 형 삼 명 과 관계 가 없 으 며 형 삼 명 이 있어 도 함수 정의 중의 형 삼 명 과 일치 할 필요 가 없다.
           길 어 지 는 배열 에서 만 형 삼 명 이 의미 가 있 고 다음 과 같다길 어 지 는 배열 은 나의 이 박문 을 상세 하 게 참고 한다..
    
    int Star_CongShanRuoShui(int n ,int user_id[n]);
      3.4 파일 역할 영역
           모든 함수 밖의 변 수 를 파일 역할 영역 으로 정의 합 니 다.파일 역할 도 메 인 을 가 진 변 수 는 정의 에서 이 정의 가 있 는 파일 의 끝 까지 모두 볼 수 있 습 니 다(파일 역할 도 메 인 변 수 는 전역 변수 라 고도 합 니 다).
    번역 부 와 파일
    컴 파 일 러 는 원본 코드 파일 과 모든 헤더 파일 을 정 보 를 포함 하 는 단독 파일 로 봅 니 다.이 파일 은 번역 단원 이 라 고 불 립 니 다.원본 코드 파일 과 include 파일 을 포함 하 는 번역 단원 입 니 다.만약 프로그램 에 여러 개의 원본 코드 파일 이 있다 면,그러면 이 프로그램 도 여러 개의 번역 단원 이 있 을 것 입 니 다.하나의 파일 역할 도 메 인 변 수 를 볼 수 있 는 범 위 는 전체 번역 단원(하나의 소스 코드 파일+헤더 파일)입 니 다.
    4.링크 상세 설명
    C 변 수 는 3 개의 링크 속성 이 있 습 니 다.링크 없 음,내부 링크,외부 링크
      4.1 링크 없 음
           블록 역할 영역,함수 역할 영역 과 함수 원형 역할 영역 을 가 진 변 수 는 모두 링크 변수 가 없습니다.이것 은 이러한 변 수 는 블록,함수 또는 원형 을 정의 하 는 것 에 속 한 다 는 것 을 의미한다.
      4.2 내부 링크
           내부 링크 변 수 는 한 번역 단원 에서 만 사용 할 수 있 습 니 다.이 변 수 는 저장 분류 설명자 static 수식 을 사용 합 니 다.다음 과 같 습 니 다.
    
    int Star_CSDN=1;                     //     ,    
    static int Star_CongShanRuoShui=2;   //     ,    
    
    int main()
    {
    	......
    	return 0
    }
      4.3 외부 링크
           외부 링크 변 수 는 여러 파일 에서 사용 할 수 있 습 니 다.외부 링크 변수의 성명 은'정의 성 성명'과'인용 성 성명'으로 나 뉜 다.C 컴 파 일 러 는 하나의 변 수 를 한 번 만 정의 할 수 있 도록 요구 하 며,중복 정의 컴 파 일 러 는 오 류 를 보고 할 수 있다.다른 파일 에서 외부 링크 변 수 를 사용 하려 면 다음 cdoe 와 같은 extern 참조 성명 을 사용 해 야 합 니 다.
    
    //file a.c
    
    //   a.c           Star_CongShanRuoShui
    int Star_CongShanRuoShui = 2;
    
    ......
    
    //file b.c
    
    //  b.c   extern       Star_CongShanRuoShui
    extern int Star_CongShanRuoShui;
    
    ......
    5.저장 기간 상세 설명
    C 대상 은 4 가지 저장 기간 이 있 습 니 다.정적 저장 기간,스 레 드 저장 기간,자동 저장 기간,동적 분배 저장 기간 입 니 다.
      5.1 정적 기억 장치
           정적 저장 소 가 있 는 대상 은 프로그램의 실행 기간 동안 계속 존재 합 니 다.파일 역할 영역 변 수 는 정적 저장 기 를 가지 고 있 습 니 다.
    파일 역할 영역 변수 에 대해 키워드 static 은 저장 기간 이 아 닌 링크 속성 을 표시 합 니 다.static 로 설 명 된 파일 역할 도 메 인 변 수 는 내부 링크 속성 을 가지 지만 내부 링크 든 외부 링크 든 모든 파일 역할 도 메 인 변 수 는 정적 저장 기 를 가지 고 있 습 니 다.
      5.2 스 레 드 기억 장치
           스 레 드 저장 기 는 병렬 프로 그래 밍 에 사용 되 며,프로그램 실행 은 여러 스 레 드 로 나 눌 수 있 습 니 다.스 레 드 저장 기간 이 있 는 대상 은 성명 되 었 을 때 부터 스 레 드 가 끝 날 때 까지 계속 존재 합 니 다.키워드 로Thread_local 에서 대상 을 설명 할 때 모든 스 레 드 는 이 변수의 개인 백업 을 받 습 니 다.
      5.3 자동 기억 장치
           블록 역할 영역의 변 수 는 일반적으로 자동 저장 기간 을 가지 고 있다.프로그램 이 이 변 수 를 정의 하 는 블록 에 들 어 갈 때 이 변수 에 메모 리 를 할당 합 니 다.이 블록 을 종료 할 때,방금 이 변수 들 을 위 한 메모 리 를 방출 합 니 다.이런 방법 을 통 해 메모리 의 중복 이용 을 실현 할 수 있다.
    길 어 지 는 배열 은 예외 가 있 습 니 다.저장 기간 은 성명 에서 블록의 끝 까지 이지 블록의 시작 에서 블록의 끝 까지 가 아 닙 니 다.
           위 에서 말 했 듯 이 블록 역할 영역의 변 수 는 보통 자동 저장 기 를 가지 지만 정적 저장 기 를 가 질 수 있다.이러한 변 수 를 만 들 기 위해 서 는 변 수 를 블록 에 설명 하고 성명 전에 키워드 static 를 추가 해 야 합 니 다.다음 과 같 습 니 다.
    
    int Star_CongShanRuoShui(int user_id)
    {
    	static int isStar = 0;
    	......
    	return 
    }
           변수 isStar 는 정적 메모리 에 저 장 됩 니 다.프로그램 이 불 러 올 때 부터 프로그램 이 끝 날 때 까지 존재 합 니 다.그러나 그 역할 영역 은 StarCongShanRuoShui()함수 블록 에서 이 함 수 를 실행 할 때 만 프로그램 이 isStar 를 사용 하여 지정 한 대상 에 접근 할 수 있 습 니 다(물론 이 변수의 주 소 를 저장 하여 간접 적 으로 이 대상 에 접근 할 수 있 습 니 다)
     5.4 동적 분배 기억 장치
           프로그램 이 실 행 될 때 malloc()등 메모리 분배 함 수 를 통 해 분 배 된 대상 은 동적 분배 저장 기간 을 가지 고 있 으 며,이러한 대상 은 free()함 수 를 사용 하여 소각 해 야 한다.
    동적 메모리 할당 과 길 어 지 는 배열 은 기능 적 으로 겹 치지 만 다 릅 니 다.
    길 어 지 는 배열 은 자동 저장 형식 으로 malloc 함수 로 만 든 배열 로 한 함수 에 국한 되 지 않 아 도 됩 니 다.
    在这里插入图片描述
    이상 은 C 언어 중의 변수 역할 도 메 인,링크 와 저장 기의 의 미 를 깊이 있 게 분석 하 는 상세 한 내용 입 니 다.C 언어 변수 역할 도 메 인,링크 와 저장 기간 에 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!

    좋은 웹페이지 즐겨찾기