1. 메모리와 변수
메모리는 프로그램이 실행될 때 사용하는 RAM(Random Access Memory)의 한 부분입니다. 메모리는 여러 “칸”으로 이루어져 있고, 각 칸은 고유한 주소를 가집니다.
변수는 메모리의 특정 칸에 데이터를 저장하는 “이름표” 역할을 합니다.
int a = 10;
변수 a는 메모리의 특정 주소를 차지하고, 값 10을 저장합니다.
a의 주소는 &a로 접근할 수 있습니다.
2. 포인터
포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 즉, 포인터는 메모리의 “위치”를 가리키는 역할을 합니다.
포인터 사용의 두 가지 핵심 연산은 다음과 같습니다.
- 참조(&): 변수의 메모리 주소를 얻음.
- 역참조(*): 포인터가 가리키는 주소에 저장된 값을 얻음.
// 'int' 타입의 데이터를 가리킬 포인터
int* ptr = &a;
3. 메모리와 포인터
- a가 메모리 주소 0x100에 저장되어 있다고 가정
- a의 값: 10
- &a (주소): 0x100
- ptr는 0x100을 저장하고, *ptr은 10을 반환. 이름 주소 값 타입
a | 0x100 | 10 | int |
ptr | 0x200 | 0x100 | int* |
#include <iostream>
using namespace std;
int main() {
int a = 10; // 변수 a 선언
int* ptr = &a; // ptr은 a의 주소를 저장
cout << "a의 값: " << a << endl; // 10
cout << "a의 주소: " << &a << endl; // 0x100 (a의 메모리 주소)
cout << "ptr의 값: " << ptr << endl; // 0x100 (a의 주소, ptr이 가리키는 주소)
cout << "ptr이 가리키는 값: " << *ptr << endl; // 10 (ptr이 가리키는 주소의 값)
}
4. 포인터 관련 헷갈릴 수 있는 점
- int* ptr에서 *는 “포인터 타입”을 선언하는 것을 의미.
- *ptr에서 *는 “역참조” 연산을 의미.
5. 참조와 포인터
참조와 포인터는 둘 다 다른 대상 개체를 가리킨다. 포인터는 대체로 별도의 변수인데 반해 참조는 대상에 대한 별칭이라는 차이가 있다.
- 포인터를 얻으면 가리키는 대상의 주소를 알 수 있다. ptr이 가리키는 대상의 실제 값을 얻으려면 역참조한다(*ptr)
- 참조값을 얻으면 컴파일러가 삽입한 코드에 의해 자동으로 역참조가 수행되고 대상값을 즉시 알 수 있다. ref의 주소를 얻으려면 주소 연산자를 명시적으로 호출해야 한다(&ref)
- 포인터에 다른 대상의 주소를 할당할 수 있으며 어떤 객체도 가리키지 않도록 nullptr값을 줄 수도 있다. 포인터는 변수이기 때문에 다른 변수에 할당할 수 있는 자체 주소가 있다(int **intPtrPtr = &intPtr)
- 참조는 초기화만 가능하며 다시 할당할 수 없다. 참조 변수에 대한 할당은 참조하는 원래 개체에 대한 할당을 의미하기 때문이다.
출처 : 266가지 문제로 정복하는 코딩 인터뷰 in C++
'내일배움캠프 > TIL' 카테고리의 다른 글
[내일배움캠프 Day11] 템플릿 (3) | 2024.12.31 |
---|---|
[내일배움캠프 Day10] 메모리 관리 (0) | 2024.12.31 |
[내일배움캠프 Day8] C++ 과제 진행 (2) | 2024.12.26 |
[내일배움캠프 Day7] Git (1) | 2024.12.24 |
[내일배움캠프 Day6] C++ 프로그래밍 기초 (0) | 2024.12.23 |