[CS] 메모리와 포인터

최지나·2023년 12월 5일
2

CS

목록 보기
25/55

1. 메모리와 주소

변수 선언 시 메모리에 할당되는 과정?

int i; // 정수형 변수 i 선언
  • 컴퓨터의 메모리는 연속된 메모리 셀로 이루어져 있고, 각 셀은 1바이트 크기를 가지며 고유한 주소를 가짐
  • 변수 i의 메모리 주소는 변수가 사용하는 메모리 주소들 중 첫 번째를 가리킨다
  • 변수에 값 할당되기 이전과 이후에 변수의 메모리 주소는 변경되지 않는다

포인터란?

  • 변수의 메모리 주소를 담고 있는 타입
  • 포인터를 통해 변수의 주소에 접근 가능
int i;
int* a = &i;  // 변수 i의 주소를 가리키는 포인터 a
  • 어떠한 타입(String, Integer,.. ) 포인터이든 상관없이 무조건 OS가 32bit라면 4바이트, 64bit라면 8바이트의 고정 사이즈를 가진다

2. 역참조 연산자

    • 에스터리스크 기호를 사용하여 포인터를 선언할 수도 있지만, 역참조 연산자로 사용되어 메모리를 기반으로 변수의 값에 접근할 수 있다
string a = "abcda";
string* b = &a;
cout << *b << "\n";  // 포인터 b가 가리키는 주소의 값을 출력, abcda

3. 배열에서 포인터로의 변환

array to pointer decay

  • 배열의 이름을 포인터에 할당하면 배열이 포인터로 변환된다
  • 이 때 배열의 크기 정보는 사라지고, 포인터는 배열의 첫 번째 요소를 가리킨다
int a[3] = {1, 2, 3};
int* c = a;  // 배열의 이름인 a가 포인터 c에 할당됨

cout << c << "\n";      // 배열의 첫 번째 요소의 주소 출력
cout << &a[0] << "\n";  // 배열의 첫 번째 요소의 주소 출력과 동일
cout << c + 1 << "\n";  // 다음 요소의 주소 출력
cout << &a[1] << "\n";  // 다음 요소의 주소 출력과 동일


REF

profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글