본문 바로가기
C++/기초

C++ 기초 : 포인터 배열

글: 시플마 2024. 3. 30.

포인터 변수는 메모리의 주소를 담을 수 있습니다.

이러한 포인터 변수의 크기는 어떻게 될까요?

int형 포인터 변수는 4Byte, 

char형 포인터 변수는 1Byte일까요?

 

그렇지 않습니다.

 

포인터 변수의 자료형은 해당 주소로 

접근하였을 때 그곳에 있는 값을

해당 자료형으로 인식하겠다는 의미일 뿐,

포인터 변수의 크기는 아닙니다.

 

포인터 변수의 크기는 가변 길이로

플랫폼에 따라 달라집니다.

 

운영체제에서 32Bit, 64Bit가 의미하는 것은

한 번에 처리할 수 있는 데이터 용량이죠?

포인터 변수의 크기는 여기에 맞추어서 정해집니다.

즉 32Bit에서 포인터 변수의 크기는 4Byte이며

64Bit에서 포인터 변수의 크기는 8Byte입니다.

 

 

확인해 보도록 하죠.

 

상단 중간에 있는 솔루션 플랫폼 칸을 'x86'(32Bit)로 설정하였습니다.

 

그리고 'sizeof'를 통해 int*의 크기를 얻어낸 후,

pSize라는 변수에 대입하였습니다. 

 

값을 확인해 보니 4가 대입되었습니다. 

sizeof는 Byte 기준으로 값을 반환하니 

int*의 크기는 32Bit 환경에서 4Byte임을 알 수 있습니다.

 

 

이번에는 char*의 크기를 볼까요?

 

마찬가지로 4Byte임을 알 수 있습니다.

int*와 char*의 크기가 같은 것을 확인할 수 있습니다.

 

 

 

솔루션 플랫폼을 'x64'(64Bit)로 바꾸고 진행하겠습니다.

 

64Bit 환경에서는 int*의 크기가 8Byte임을 알 수 있습니다.

 

 

short*의 크기도 볼까요?

 

short*의 크기도 마찬가지로 8Byte네요.

 

포인터의 크기는 자료형에 따른 것이 아닌 

환경에 따라 달라지는 것을 알 수 있네요.

 

 


 

 

 

포인터 변수는 주소를 정수로 저장하는 변수입니다.

그렇다면 포인터 변수에 1을 더하면 무슨 일이 벌어질까요?

 

아래 코드처럼 말이죠.

 

 

 

한번 생각해 봅시다.

 

위와 같은 메모리 공간이 있습니다.

포인터 변수 pInt가 1000번지의 주소를 저장하고 있다고 합시다.

여기에 1을 더하면 "음, 번지는 1Byte 단위로 나누고 있으니까

1001번지의 주소를 저장하게 되지 않을까?"라는 생각이 드시나요?

 

 

하지만 실제로는 1004번지의 주소를 저장하게 됩니다.

포인터 변수 값에 1을 더한다는 것은 다음 번지의 주소를

저장한다는 의미라기보다는 포인터 변수의 자료형만큼 건너가 

그곳 번지의 주소를 저장한다고 생각해야 합니다.

(2를 더하면 포인터 변수의 자료형만큼 두 번 건너가 저장할 것입니다.)

 

포인터 변수 pInt의 자료형은 int였기 때문에 4Byte만큼 건너가 

1004번지의 주소를 저장하는 것이죠.

 

만약 pInt의 자료형이 char형이면 1Byte만큼, 

short형이면 2Byte만큼 건너가 해당 번지의 주소를 저장했을 겁니다.

 

 


 

 

 

포인터에 대해 배우면 배열을 더 잘 이해할 수 있습니다.

 

배열의 특징은 아래와 같습니다.

1. 할당한 메모리 공간이 모두 연속적이다.

2. 배열의 이름이, 배열의 시작 주소이다.

 

아래 코드를 통해 이해해 보죠.

 

int형 배열 iArr을 선언하였습니다.

iArr은 10개의 인덱스로 이루어져 있으며 

각 인덱스에는 0이 들어가 있을 것입니다.

 

배열의 이름인 iArr이 해당 배열의 시작 주소이기 때문에

iArr;이라는 코드는 곧 배열 iArr의 시작 주소를 의미할 겁니다.

 

 

그럼 iArr에 1을 더하면 어떤 의미일까요?

 

주소에 1을 더한다는 것은

단지 다음 번지로 넘어간다는 것이 아닌,

자료형만큼 건너간다는 것을 이제 우리는 압니다.

포인터 변수처럼 말이죠.

 

즉 배열 iArr의 시작 주소에 1을 더한 것은 

배열 iArr의 두 번째 칸의 주소를 의미할 것입니다.

(배열의 각 칸은 int형이기 때문에

각 칸의 주솟값의 차이는 4(Byte)입니다.)

 

 

그럼 두 번째 칸에 숫자를 대입하고 싶으면 어떻게 할까요?

 

위 코드, 11번째 줄에서 보이는 것처럼

'*'을 붙여 해당 주소로 직접 접근하여 1을 대입하면 되겠죠?

확인해 보니 정말 두 번째 칸에 1이 대입되었습니다.

 

 

마찬가지로 첫 번째 칸에 1을 대입하고 싶으면?

 

위 코드처럼 시작 주소에 아무것도 더하지 않고

바로 1을 대입하면 될 것입니다.

 

 

아래 코드를 봅시다.

 

7, 8번째 줄의 주석을 볼까요?

 

여기서 배열에서 인덱스가 0부터 시작하는 이유를 알 수 있습니다.

배열의 시작 주소로부터 얼마큼 건너갔냐는 의미이기 때문인 거죠.

 

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : const  (0) 2024.03.30
C++ 기초 : 포인터 문제 풀이와 해답  (0) 2024.03.30
C++ 기초 : 포인터  (0) 2024.03.29
C++ 기초 : 운영체제  (0) 2024.03.29
C++ 기초 : 정적 변수와 외부 변수  (0) 2024.03.29