본문 바로가기
C,C++

[C/C++] 포인터란?

by dabiLibrary 2024. 4. 25.
728x90
반응형

프로그래밍 공부하는 사람들 중에 포인터에서 무너지는 사람들이 많다던데,, 도대체 포인터가 뭐길래?

근데 막상 잘~ 이해하면 그렇게 어려운 개념은 아니다. 메모리에 대한 이해도가 어느정도 있는 상태에서 포인터를 공부한다면! 포인터는 메모리 내의 주소 값을 나타내기 때문이다.

포인터란?

포인터는 해당 값의 메모리 주소를 가리키는 것이다.

int a; 라고 변수를 선언하고 a = 10; 이렇게 해당 변수에 10이라는 값을 할당해주면 a는 자동적으로 메모리 주소가 할당되며 10이라는 값은 해당 메모리 주소에 저장된다.

여기서 만약 int *b; 라는 포인터 변수를 선언한다면. 참고로 *는 포인터를 선언할 때의 기호이다. 역참조 연산자라고 한다. 자료형과 변수 이름 사이에 *를 붙여주면 된다. 그럼 b라는 포인터 변수에 a 변수의 주소 값을 할당시키고 싶다면? b = &a; 를 입력해주면 된다. 그럼 b에는 a의 메모리 주소값이 저장된다.

'&'기호는 주소 연산자다. 변수의 주소를 넘기고 싶을 때 변수 이름 앞에 &를 붙이면 된다.

위처럼 코드를 작성하면 b의 값과 &a의 값은 동일하게 나온다. 동일하게 a의 주소값이 출력된다.

 

그럼 포인터를 쓰는 이유는?

변수에 값만 입력하면서 코딩할 수 있는데 왜 굳이 포인터를 쓸까? 포인터는 사실 굉장히 유용하다. 바로 효율성에서 굉장히 유용하다.

일단 메모리를 절약하는 데 용이하게 사용될 수 있다. 예를 들어, void Plus(int a) { a += 10; } 이라는 매개변수에 10을 더해주는 함수가 있다고 치자. 이 매개변수에 int b = 1;인 b를 넣으며 함수를 선언할 것이다. 그러면 b가 11이 되는 게 아니라, b라는 값을 복사해서 매개변수로 입력되는 것이기 때문에 b변수의 메모리 공간을 하나 더 사용하는 꼴이 된다. 즉 값이 복사되어 전달된다는 뜻. b와 매개변수의 값은 독립되어 결국 매개변수에 b를 넣어도 실제 b의 값은 변하지 않고, 메모리 공간도 b변수의 2배만큼 더 쓴다는 것이다.

근데 여기서 포인터로 전달해준다면? void ChangeValue(int* _a) { *_a = 20; } 이라는 함수가 있다고 치자. ChangeValue(&a); 매개변수에 a의 주소값을 전달시키고 함수를 작동시키면 실제 10이었던 a변수는 20으로 변한다. 포인터는 값형식이 아닌, 참조형식(Reference)이라서 원본 값의 주소를 전달해주어 원본을 건드리는 게 된다. 그리고 매개변수로 포인터를 넘겨줄 때 a의 주소값만 넘겨주면 되기 때문에 a변수만큼의 메모리 공간을 사용할 필요가 없다.

또한 배열을 반복할 때에도 인덱스를 대신해서 사용이 가능하다. 배열은 포인터를 사용하여 구현되기 때문에..

+ C++에서 동적으로 메모리를 할당할 수 있다. 등 여러 장점이 존재한다~

출처: https://youtu.be/u65F4ECaKaY?si=TLIeBS9Z7eryrNAu

 

 

출처: https://blog.naver.com/dabilibrary/223420539195

728x90
반응형