오늘은 C++에서 포인터와, new 연산자 나아가서 vector 에 대해서 알아볼 것이다.
포인터 : what var point?
포인터는 말 그대로 무엇을 가르키는지 주소(위치)를 나타냅니다.
간접 참조 연산자 *을 사용하여 표현할 수 있습니다.
int a = 6; //일반 변수 a
int* b; //변수의 주소(위치)를 담는 포인터 변수 b
b = &a; // a의 주소를 b에 대입, 이제 b는 a를 가르키는 포인터
cout << a << endl; //a의 값 = 6
cout << *b << endl; //b가 가르키는건? a이므로, *b = a의 값 = 6
프로그램을 실행하는 동안에, 이름이 없는 메모리, 아직 결정되지 않은 메모리를 대입할 수 있다는게 포인터의 진정한 쓸모입니다.
new 연산자 : 데이터형을 말해봐(메모리 할당)
원하는 데이터형을 new 연산자에게 말하면, 데이터형에 맞는 메모리블록을 찾은 후 주소를 리턴해줍니다.
int* pointer = new int;
delete pointer;
- 메모리를 할당해서 데이터 객체를 가르키고 있다.
- 메모리 제어권을 사용자한테 넘겨준다는 이점이 있다.
- 이후 free()처럼, delete를 사용하여 메모리 할당 해제를 꼭!! 해야한다.
간단한 예시
#include <iostream>
int main(){
using namespace std;
int* nums = new int[4]; // int형 데이터 4개를 저장할 수 있는 공간 대입
nums[0] = 4;
nums[1] = 2;
nums[2] = 1;
nums[3] = 5;
cout <<"nums is " << *nums << "\n";
cout <<"nums[0] is " << nums[0] << "\n";
cout <<"nums is " << nums << "\n";
delete[] nums;
return 0;
}
코드를 보면 알다싶이, 포인터는 배열 형태로도 지정 할수도 있고, 이렇게 배열 형태로 지정해준다면 delete를 할 때도, 배열 대괄호 [] 을 사용해줘야한다.
실행결과 :
그림으로 본다면, nums가 4개의 int 배열 형태의 메모리를 가르키고 있고, 그 첫번째 자리를 가르키고 있다.
각 배열도 포인터 역할을 하여, 그 메모리 공간에 할당된 값을 알려준다.
Call by reference
C언어와 다르게, C++ 에서는 매개변수를 참조변수로 선언하는 방식이 있습니다.
레퍼런스는 쉽게 생각해서, 변수의 다른이름(별명)을 지어주는 것입니다.
그래서 같은 메모리를 할당받고 있고, 다른 변수가 아닙니다.
void swap_call_by_address(int* num1, int* num2){
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
swap(&a, &b);
void swap_call_by_reference(int& num1, int& num2){
int temp = num1;
num1 = num2;
num2 = temp;
}
swap(a, b);
위의 swap 함수는, C에서 자주 쓰는 방법으로 주소를 복사하여 주소를 바꾸는 형식입니다.
int num = &a 라고 보면 이해가 더 쉽습니다.
아래는 래퍼런스 선언을 하여, 변수에 이름을 하나 더 지어줘서, 바꾼 것입니다.
int& num1 = a 라고 보면 이해가 더 쉽습니다.
그림으로 이해하기!
첫번째 call by address(pointer)는 포인터 변수가 새로 생겨서 메모리를 더 쓰게됩니다.
call by pointer는 외부 포인터가 내부 값을 머리끄댕이 잡고 바꿔주는 느낌입니다.
반면, call by reference는 그냥 메모리에 다른 이름(별명)을 하나 더 주어서,
C에서 했던 call by vlaue 느낌을 다른 함수에서도 쓸 수 있게 합법화(?)하는 느낌입니다.
REFERENCE
- Inflearn - [하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문
※공부하면서 쓰는 내용이라 틀린부분이 있을 수 있습니다! 언제든 지적과 질문 환영합니다
'코딩 > C, C++' 카테고리의 다른 글
[C++] 문자열을 정수로 바꾸기, 문자열 파싱하기 (stringstream, sstream) (0) | 2024.03.24 |
---|---|
[C++] vector 기본 문법 및 명령어 (0) | 2024.03.22 |
C언어로 게임 만들기(7) - 완성. (코드, 구현 영상) (0) | 2023.06.02 |
C언어로 게임 만들기(5) - 게임 씬 추가(getch함수, exit함수) (0) | 2023.05.28 |
C언어로 게임 만들기(4) - 적 구현(rand함수, srand함수, time함수) (1) | 2023.05.20 |