C/C++에서 지침 에 대한 깊 은 이해

6372 단어 c + +포인터
컴퓨터 의 메모리 모델
CPU 는 컴퓨터 의 핵심 부품 입 니 다.CPU 를 작 동 시 키 려 면 명령 과 데 이 터 를 제공 해 야 합 니 다.명령 과 데 이 터 를 메모리 에 저장 해 야 합 니 다.즉,우리 가 평소에 말 하 는 메모리 입 니 다.
메모 리 는 물리 적 메모리 와 가상 메모리 로 나 뉘 는데 물리 적 메모 리 는 컴퓨터 의 메모리 바 에 대응 하고 가상 메모 리 는 운영 체제 메모리 관리 시스템 이 가상 으로 만 든 것 이다.이것 은 우리 본문의 중점 이 아니 기 때문에 우 리 는 구분 하지 않 는 다.
cpu 캐 시 를 고려 하지 않 은 상태 에서 컴퓨터 실행 프로그램 은 본질 적 으로 메모리 에 있 는 데 이 터 를 조작 하 는 것 입 니 다.저장 소 는 여러 개의 저장 장치 로 나 뉘 어 져 있 습 니 다.저장 부 는 0 부터 순서 번 호 를 매 깁 니 다.CPU 는 메모리 에서 데 이 터 를 읽 으 려 면 먼저 저장 장치 의 주 소 를 지정 해 야 합 니 다.
CPU 가 메모리 에서 데 이 터 를 읽 는 과정 은 다음 과 같 습 니 다.

컴퓨터 는 메모리 관 리 를 편리 하 게 하기 위해 서 메모리 의 모든 단원 을 하나의 숫자 번호 로 사용한다.
포인터 와 포인터 상수
포인터 의 본 뜻 은 메모리 주소 입 니 다.우 리 는 메모리 번호 로 쉽게 이해 할 수 있 습 니 다.컴퓨터 가 번 호 를 통 해 메모리 셀 을 조작 하 는 이상 포인터 의 효율 을 높 일 수 있 습 니 다.
포인터 변수:
  • 메모리 포인터 의 변수,즉 메모리 주소(메모리 번호)를 저장 하 는 변수
  • 로 통속 적 으로 이해 된다.
  • 포인터 변 수 는 int,float,char 등 유형 과 똑 같이 변수 유형 에 속 하고 포인터 변수 유형 은 네 개의 바이트(32 비트 기계 아래)를 차지 하 며 32 비트 의 메모리 주 소 를 저장 합 니 다.
    별표:
  • C\C++에서(*)내용 기호 로 정의
  • 모든 포인터 변수 가 차지 하 는 메모리 크기 와 저 장 된 메모리 주소 크기 는 같 지만 데이터 의 메모리 첫 주소 만 저장 되 어 있 기 때문에 포인터 변수 가 저장 하 는 메모리 주소 가 가리 키 는 데이터 형식 은 이 첫 번 째 주 소 를 어떻게 분석 하 는 지 결정 합 니 다
  • 예 를 들 어 int 형 포인터 변 수 는 이 포인터 변수 가 저장 한 첫 번 째 주소 부터 4 바이트 의 메모리 공간
  • 을 계속 검색 해 야 합 니 다.
  • 그래서 우리 가*p 를 사용 할 때 p 가 어떤 유형의 지침 인지 알 아야 합 니 다.
  • 포인터 변수 와 포인터 상수
    포인터 변 수 는 먼저 하나의 변수 입 니 다.포인터 변 수 는 특정한 변수의 메모리 주 소 를 저장 하기 때문에 우 리 는 보통'포인터 변 수 는 이 변 수 를 가리 키 고 있다'고 생각 합 니 다.또한 포인터 변 수 는 변 수 를 가리 킬 때 변 수 를 가리 키 며 그 값 은 변동 할 수 있 습 니 다.
    반면 포인터 상수 는 고정된 메모리 단위 주소 번 호 를 저장 하 는 양 으로 통속 적 으로 이해 할 수 있 으 며,메모리 주 소 를 저장 한 후 에는 다른 메모리 주 소 를 저장 할 수 없다.
    예 를 들 어:
    
    void f(const int *x,int *y)
    {
    	*x=2;//  ,  x    const  ,       x           
    	//    
    	*y=3;
    }
    
    포인터 변수 와 배열
    먼저 예 를 하나 봅 시다.
    
    	int a[5]={1,2,3,4,5};
    	int *ptr=(int*)(&a+1);
    	cout<<*(a+1)<<endl;
    	cout<<*(ptr-1)<<endl;
    
    출력 결 과 는 2 와 5 입 니 다.우선&a+1 의 의 미 를 살 펴 보 겠 습 니 다.
  • 우 리 는 C\C++에 규정된 배열 이름 이 이 배열 의 첫 주 소 를 나타 내 는 것 을 알 고 있 습 니 다.여기에&a 라 는 기호 가 나 타 났 습 니 다.원래 a 는 지침 상수 이 고 주 소 를 다시 찾 는 것 은 불법 작업 이 아 닙 니까?
  • 이때 우 리 는 이&a 를 배열 을 가리 키 는 지침 으로 볼 수 있 고 줄 지침 이 라 고도 부 릅 니 다.&a 의 유형 은 int(*p)[5]이 고 한 걸음 길이 즉 5 개의 요소 의 길이 입 니 다.&a+1 은 한 걸음 길 이 를 뒤로 이동 하 는 것 을 의미 합 니 다.
  • 분석:
  • a 는 첫 번 째 요소 의 첫 번 째 주 소 를 표시 합 니 다.그러면 a+1 은 다음 요소 의 메모리 첫 번 째 주 소 를 가리 키 기 때문에*(a+1)=2
  • 그리고&a 는 전체 데이터 의 첫 번 째 주 소 를 표시 합 니 다.그러면&a+1 이동 메모리 수 는 전체 배열 이 차지 하 는 바이트 수 입 니 다.만약 에 원래 배열 의 첫 번 째 요소 의 첫 번 째 주소 가 0 이 라면&a+1 은 20 을 표시 합 니 다.이 주 소 는 배열 에 속 하지 않 습 니 다.이 어(int*)(&a+1)를 통 해 배열 지침 을 정형 지침 으로 바 꿉 니 다.이렇게 원래&a+1 이 표시 한 데이터 범 위 는 20-39 에서 20-23 으로 축소 되 었 습 니 다.마침 int 형의 크기 이 고 ptr-1 은 16 입 니 다.데이터 메모리 범 위 는 16-19 입 니 다.이렇게*(ptr-1)는 바로 마지막 요소 5 입 니 다.
  • 위의 예 는 간단 한 데이터 형식 을 통 해 메모리 분 포 를 설명 할 뿐 실제 복잡 한 데이터 형식,특히 일부 사용자 정의 클래스 나 구조 체 유형,메모리 분 포 는 바이트 정렬 을 충분히 고려 해 야 한다.
    함수 포인터
    함수 포인터 란 함 수 를 가리 키 는 포인터 변수 입 니 다.C\C++프로그램 이 컴 파일 할 때 모든 함수 에 입구 주소 가 있 습 니 다.이 입구 주 소 는 함수 포인터 가 가리 키 는 주소 입 니 다.가리 키 는 함수 의 포인터 변수 가 있 으 면 이 포인터 변수 로 함 수 를 호출 할 수 있 고 함수 의 매개 변수 도 할 수 있 습 니 다.
    우 리 는 먼저 함수 포인터 호출 함 수 를 보 았 습 니 다.다음 과 같 습 니 다.
    
    int f(int x, int y) {
    	return x + y;
    }
    //        
    typedef int (*pf)(int, int);
    int main()
    {
    	int a = 1;
    	int b = 2;
    	//   f        pf
    	pf = f;
    	//          
    	int c = (*pf)(a, b);
    	cout << c << endl;
    }
    
    주의해 야 할 것 은 정 의 된 함수 포인터 형식 시의 함수 서명(함수 반환 값 과 함수 매개 변수 목록 의 유형,개수,순서 포함)은 이 유형의 변수 에 할당 한 함수 서명 을 일치 시 켜 야 합 니 다.그렇지 않 으 면 예측 할 수 없 는 상황 이 많이 발생 할 수 있 고 C\C++규정 함수 이름 은 함수 입구 주 소 를 표시 하기 때문에함수 명 할당 시 함수 명 앞 에 주소 부 호 를 추가 하거나 추가 하지 않 거나 모두 같 지만 C++에서 클래스 를 찾 는 방법 함수 의 주 소 를 추가 할 때 이&기 호 는 생략 할 수 없습니다.
    함수 지침 은 또 다른 용도 가 있 습 니 다.바로 함수 의 매개 변수 로 서 Windows 프로 그래 밍 에서 리 셋 함수 로 서 흔히 볼 수 있 습 니 다.
    
    typedef int (*PF)(int, int);
    int f1(int x, int y)
    {
    	return x + y;
    }
    int f2(PF pf, int t)
    {
    	return (*pf)(3, t);
    }
    int main()
    {
    	//   f1         f2
    	int c = f2(f1, 4);
    	cout << c << endl;
    	return 0;
    }
    
    C++의 인용
    인용 이란 다른 변수 이름 을 사용 하여 특정한 메모 리 를 대표 하 는 것 입 니 다.이것 은 같은 사람 이 다른 이름 을 가 진 것 과 같 지만 어떤 이름 이 든 같은 사람 을 말 합 니 다.
    
    int a=1;
    //  &  , b   a   
    int &b=a;
    //b a    ,   int c=a
    int c=b;
    
    C++규정,인용 을 정의 할 때 바로 초기 화 해 야 합 니 다.
    값 전달 또는 인용 전달
    만약 에 변수 유형 이 기본 메타 데이터 형식 이 라면 int,float,bool,char 등 작은 데이터 형식 을 기본 메타 데이터 형식 이 라 고 부 르 면 할당 할 때 값 을 전달 합 니 다.이때 b 의 값 은 a 의 복사 입 니 다.그러면 b 를 변경 하면 a 에 영향 을 주지 않 습 니 다.그러나 변수 데이터 유형 이 복잡 한 데이터 형식 이 라면 배열,클래스 대상 이 라면 할당 할 때 전달 하 는 것 이 바로 인용 입 니 다.이때.a 와 b 가 가리 키 는 것 은 모두 같은 메모리 영역 입 니 다.그러면 a 나 b 를 변경 하 더 라 도 서로 영향 을 줍 니 다.
    마지막 으로 C++에서 구조 함수 복사 대상 을 복사 할 때 주의해 야 합 니 다.기본 메타 데이터 형식 은 직접 복사 할 수 있 지만 인용 형식 데이터 에 대해 우 리 는 인용 형식의 진정한 복 제 를 실현 해 야 합 니 다.
    C++의 new 키워드
    c++에서 new 키 워드 를 통 해 대상 을 정의 합 니 다.대상 의 인 스 턴 스 를 직접 얻 을 수 없습니다.우 리 는 하나의 포인터 로 이 new 에서 나 온 대상 을 받 아야 합 니 다.우 리 는 이 대상 을 인용 하려 면 반드시 포인터 로 연산 자 를 인용 해 야 합 니 다->
    
    #include <iostream>
    using namespace std;
    class Person
    {
    public:
    	Person()
    	{
    
    	}
    	Person(int a, int b)
    	{
    		this->m_a = a;
    		this->m_b = b;
    	}
    	int m_a;
    	int m_b;
    };
    int main()
    {
    	// C++                ,per1 per2     person   
    	Person per1;
    	int i = 1;
    	int j = 2;
    	Person per2(i, j);
    }
    
    C++에서 this 키 워드 는 하나의 지침 이지 자바 에서 하나의 인 스 턴 스 가 아 닌 C+에서*this 가 자바 와 같 습 니 다.
    
    class Person
    {
    public:
    	Person(int number)
    	{
    		//C++           
    		this->m_number = number;
    	}
    	//      ,,      ,               ,               
    	Person& getSelf()
    	{
    		return *this;
    	}
    	int m_number;
    };
    
    총결산
    C/C++에 있 는 지침 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C/C+지침 이해 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기