-
[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++ 컴파일러'ROS & Programming' 카테고리의 다른 글
Ubuntu 18.04.05 LTS 가상머신에 설치하기 (0) 2021.01.18 Ubuntu18.04에 ROS 설치 및 개발환경 구축 (1) 2021.01.04 왜 리눅스를 사용하는가? (0) 2020.12.28