더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 15.포인터와 배열

더듬이 2021. 8. 30. 23:28
728x90

포인터 변수의 크기

int* p_int;
float* p_float;
char* p_char;

cout << sizeof(p_int) << endl;
cout << sizeof(p_float) << endl;
cout << sizeof(p_char) << endl;

위와 같이 포인터 변수 세개를 선언해주었다.

이 포인터 변수들의 크기는 전부 같을까? 다를까?

모두 같다.

포인터 변수 앞에 붙어있는 자료형은 내가 가리키는 변수의 주소를 어떤 방식으로 바라볼 것인지를 말해주는 것이기 때문에, 자료형별로 크기다 다를 이유가 전혀 없다!!

근데 왜 8바이트 일까?

⇒포인터의 크기는 가변적이다. 32비트 , 64비트 운영체제에 따라 4바이트가 될 수 있고 8바이트가 될 수 있다.

운영체제가 한번에 처리할 수 있는 단위가 8바이트이기 때문에 포인터 변수도 8바이트 인 것이다.

만일 처리할수 있는 단위가 4바이트라면, 주소 변수로 만드는 것도 4바이트가 최대일 것이다.

주소를 가질수 있는 최소 단위는 바이트이다.

4바이트는 표현할 수 있는 주소는 0~2^32-1까지이다.

이를 계산하면 4바이트 기반의 32비트 운영체제에서는 4기가바이트까지 표현이 가능하다.

만일 16기가바이트의 RAM을 꽂았다면??

⇒나머지 12기가 바이트의 공간은 의미가 없는 것이다.

다행히도 요즘에는 기술의 발전으로 기본적으로 64비트의 운영체제가 설치된다.


주소 연산 과정

int value;
int *pointer=&value;
pointer++;

이런 코드가 있다면, 포인터는 어느 값을 가리킬까?

value의 주소가 100이라고 하면, 현재 포인터는 100을 가리키고 있다.

포인터의 +1의 의미는 일반 정수의 +1의 의미와는 다르다.

증가 연산자가 적용된 이후라고 하면, 포인터는 int자료형으로 보는 포인터이기 때문에,

4바이트, 즉 다음 int위치로 가갰다는 뜻으로 해석된다.

++는 단순히 주소값을 1늘리는 것이 아니라, 현재 가리키는 변수만큼의 크기를 이동하게 된다.

마치 다음 단계로 가는 느낌이다. 현재 포인터가 어떤 자료형을 보는지에 따라서

그 크기만큼 한 단계의 크기가 정해진다!!!!!


포인터와 변수의 상관관계

int arr[10]={};

1.배열은 메모리가 연속적이다.

우리는 이를 이용해서 포인터를 이용해 배열의 각 요소에 접근이 가능해진다.

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

배열의 이름 자체는 배열의 주소를 가지는 포인터가 된다.

그래서, arr은

크게 보면 배열의 주소값,

작게 보면, 배열의 첫 원소의 주소값을 나타낸다!

그럼 포인터의 다음 단계는 배열의 다음 인덱스의 주소가 되는 것이다.

포인터의 +1은 현재 가리키는 변수의 크기만큼을 이동하는 것을 의미한다.

배열의 첫 주소를 통해 배열의 각 원소에 접근을 할 수 있는 것이다.

int arr[10]={};
*(arr+1)=10; //arr[1]=10 과 같다.

 

이러한 주소 연산 방식 떄문에 배열의 인덱스가 0부터 시작하는 것이다.

즉, 배열의 특정 인덱스를 접근하는 것이 주소 접근을 이용하겠다는 것이다.

728x90