ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 포인터 변수와 레퍼런스 변수
    ROS & Programming 2021. 1. 10. 17:42

     

     

    포인터 개념

    ◆포인터

    • 할당된 메모리 공간주소를 가리키는 변수
    • 주소(Address)와 타입(Type)으로 구성되며 특별한 연산자를 이용하여 접근
    • 포인터 변수는 항상 4바이트 메모리가 할당, 타입은 포인터 변수가 가리키는 번지로 가서 몇 바이트를 읽어오는가를 결정

     

    ◆포인터 연산자

    • * : Dereference Operator
    • & : Address of Operator

     

    int x = 10;    //변수: 메모리가 할당된 공간에 붙은 이름
    int y = 20;
    int *ptr = &x; //포인터 변수: 포인터(메모리의 특정 위치)를 저장
    int &ref = x;  //레퍼런스 변수: 할당된 공간에 이름을 하나 더 추가시키는 것(별칭)
    
    func(&x, &y)
    
    void func(int *x, int *y){
        int temp;
        temp = *x;
        *x = *y;
        *y = temp;
    }

     

    실전 포인터!

    • 연산자는 자료형, 변수명 어디에 붙어도 상관없으나, 자료형에 붙일 경우 제일 먼저 선언된 변수 하나만 포인터 변수로 선언되므로 주의
    • 레퍼런스 변수의 경우 선언과 동시에 초기화되어야 하고, 이름이 존재하지 않는 대상에 레퍼런스 할 수 없음(ex. int &ref = 10; //x)
    • call by pointer : 매개변수 전달 시 메모리 소모 및 값 복사 발생 (주소 값 저장을 위해)
    • call by reference : 메모리 소모 없고 값 복사 발생하지 않음 (같은 메모리 공간 참조)

     

    #include <iostream>
    
    using namespace std;
    
    int main(){
        int val = 10;
        int &rVal = val; //레퍼런스 선언
        
        val++;
        cout<<"val = "<<val<<endl;
        cout<<"ref = "<<rVal<<endl;
        
        rVal++;
        cout<<"val = "<<val<<endl;
        cout<<"ref = "<<rVal<<endl;
        
        cout<<"val address = "<<&val<<endl;
        cout<<"ref address = "<<&rVal<<endl;
        
        return 0;
    }
    더보기

    [코드 실행결과]

    ref = 11

    ref = 11

    val = 12

    ref = 12

    val address = 0x7ffddf94dbc4

    ref address = 0x7ffddf94dbc4

     


     

    동적할당

    • 프로그램 실행 도중에 메모리를 할당받아 데이터를 저장하는 것
    • malloc - free
    • new - delete

     

    malloc 동적할당

    • malloc : memory allocation
    • 라이브러리가 기본적으로 제공하는 함수로 C, C++에서 모두 사용 가능
    • 생성자, 소멸자를 호출하지 않고 void*를 리턴하여, sizeof 연산자나 연산자 캐스트를 사용할 것

     

    포인터 = (데이터타입*)malloc(할당할 데이터 크기);
    int *p = 0;
    p = (int*)malloc(sizeof(int)); //sizeof(int) = int의 데이터 크기 = 4

     

    #include <iostream>
    
    using namespace std;
    
    int main(){
        int *p = 0;
        int size = 0;
    
        cin>>size;
        p = (int*)malloc(sizeof(int)*size);
    
        cout<<"input : ";
        for(int i=0; i<size; i++)
            cin>>p[i];
    
    	cout<<"output : ";
        for(int i=0; i<size; i++)
            cout<<p[i]<<" ";
    
        return 0;
    }
    
    더보기

    [코드 실행결과]

    4

    input : 1 2 3 4

    output : 1 2 3 4

     

     

    ◆free 동적할당해제

    • 정적할당된 메모리는 프로그램 종료직전에 컴파일러가 모든 메모리를 삭제시켜 줌
    • 동적할당된 메모리는 프로그램이 실행되는 동안 생성되어, 컴파일러가 관리해주지 못함(우리가 더 이상 사용할 일이 없음에도 불구하고, 컴퓨터의 데이터를 영구적으로 사용하게 된다)
    • 이를 위해 프로그램 실행 중 동적할당된 메모리를 해제하여, 컴퓨터의 메모리가 삭제되도록 작업해주어야 함

     

    free(동적할당된 데이터);
    free(p); //동적할당해제

     

    new 동적할당

    • C++ 언어에서 기본적으로 제공하는 키워드로 C++에서만 사용 가능
    • 생성자, 소멸자를 호출하며 해당 타입의 포인터를 리턴
    • malloc 처럼 별도의 형 변환을 거치지 않고 자료형을 사용

     

    자료형 *포인터이름 = new '할당하고 싶은 크기의 자료형'
    int *p1 = new int;
    int *a1 = new int[5];
    double *a2 = new double[7];

     

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    int main(void){
    	int* p1 = new int; //int형 변수 할당
        *p1 = 15;
        cout<<*p1<<endl; //변수 출력
        delete p1; //int형 변수 할당해제
        
        char* str = new char[20]; //char형의 배열 할당
        strcpy(str, "idplab-sooyeon"); //strcpy 함수를 이용하여 문자열 메모리에 복사하기
        cout<<str<<endl;
        delete[]str; //char형 할당해제
    }
    더보기

    [코드 실행결과]

    15

    idplab-sooyeon

     

     

    delete 동적할당해제

     

    delete 변수이름;
    delete p1;
    delete []a1;
    delete []a2;


    온라인 C++ 컴파일러

     

    Online C++ Compiler - online editor

    OnlineGDB is online IDE with C++ compiler. Quick and easy way to compiler c++ program online. It supports g++ compiler for c++.

    www.onlinegdb.com

     

Designed by Tistory.