인강 & 책 스터디 노트/Coursera 가속화된 컴퓨터 과학 기초

[c++] 스택 메모리, 포인터

thisisamrd 2024. 7. 30.

C++의 메모리 관리와 관련된 여러 중요한 개념에 대해 스택 메모리와 포인터를 중심으로 복습할 겸 포스팅 해봅니다.

 

 

c++

 

변수의 네 가지 속성

C++ 의 변수에는 네 가지 속성이 있습니다.

 

1. 이름(name): 변수의 이름
2. 유형(type): 변수의 데이터 타입(ex. int, char, float)
3. 값(value): 변수에 저장된 실제 데이터 값 
4. 메모리 주소(memory address): 변수의 메모리 위치를 나타내는 주소 

 

 

 

 

스택 메모리 (Stack Memory)

스택 메모리는 함수 호출 시 할당되는 메모리 영역으로, 함수가 종료되면 해당 메모리가 반환됩니다. 스택 메모리는 LIFO(Last In, First Out) 방식으로 작동합니다. 이는 마지막에 할당된 메모리가 가장 먼저 해제된다는 의미입니다. 또한 스택 메모리는 항상 높은 주소에서 시작해서 낮은 주소로 이동하며 확장됩니다.

 

 

주소 연산자(&)

'&'는 변수의 메모리 주소를 얻기 위해 사용합니다.

'&num'은 변수 'num'의 메모리 주소를 반환합니다.

 

 

 

 

포인터(Pointer)

포인터는  다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터 선언은 데이터 타입 뒤에 '*'를 붙여서 합니다.

int num = 7;
int *p = # // p는 num의 주소를 저장하는 포인터

 

 

역참조 연산자(*)

포인터가 가리키는 메모리 주소의 값을 얻기 위해 사용합니다.

ex. '*p'는 포인터 'p'가 가리키는 변수의 값을 반환함 

 

저도 이 부분이 조금 헷갈렸는데 아래 예시를 보니 이해가 되었습니다.

 

 

포인터와 역참조 연산자 예제 코드 

#include <iostream>

int main() {
    int num = 7;       // 정수 변수 num 선언 및 초기화
    int *p = &num;     // 포인터 변수 p 선언 및 num의 주소로 초기화

    std::cout << "Original value of num: " << num << std::endl;  // num의 원래 값 출력
    std::cout << "Address of num: " << &num << std::endl;        // num의 메모리 주소 출력
    std::cout << "Value of p (address of num): " << p << std::endl;  // p의 값(즉, num의 주소) 출력
    std::cout << "Value pointed to by p: " << *p << std::endl;   // p가 가리키는 값(num의 값) 출력

    *p = 42;  // 역참조 연산자를 사용하여 num의 값을 42로 변경

    std::cout << "New value of num: " << num << std::endl;       // 변경된 num의 값 출력

    return 0;
}

 

 

스택 프레임 

함수 호출 시 생성되는 메모리 블록으로, 각 함수 호출마다 스택에 새로운 프레임이 쌓이고 함수가 종료되면 해당 프레임이 제거됩니다.

댓글