포인터

SangHoon Lee·2020년 4월 18일
1

안녕하세요 c++을 공부하고있는 대학생입니다.
이번에는 포인터에 관한 부분을 공부해보려고 합니다.

포인터란?
메모리의 주소값을 저장하는 변수

간단하게 포인터 예제를 보자면,

int a = 10; // 변수
int *b = &a

int a 에 10을 선언 해 주고,
에스크리터로 b를 포인터로 선언해주고 , 앰퍼샌드로 a 에 대한 해당 변수의 주소값을 반환함으로써, *b의 값이 10이됨을 볼 수 있습니다.

#include <iostream>

int main() {
	int a = 10;
    int *b = &a;
    
    std::cout<<*b;

그렇다면 가장 중요한 핵심인 포인터는 왜 사용할까? 에 대해 정리 해 보았습니다.
이유는 간단합니다.

  1. 메모리 주소를 참조해서 접근을 보다 빠르게 할 수 있습니다.
    => 포인터는 변수 선언과 다르게, 메모리 복사과정을 거치지 않기 떄문입니다.
  2. 복잡하고 연산이 긴 코드를 깔끔하게 보여 줄 수 있고 속도면에있어서도 이점이 있습니다.
  3. 가장 중요한 메모리공간에 대한 효율성도 있습니다.
  4. 함수 -> 함수에서 배열 , 문자열 등을 쉽게 보낼 수 있습니다.

단점으로는,
1. 예외처리문제
=> null 포인트 처럼 예외처리가 확실하지 않은 경우
2. 잘못 사용하면 돌이킬 수 없는 결과를 가져옵니다.
=> 꼬이고 꼬이기때문이죠.

그렇다면 포인터와 배열은 같은가?
제가 학교다니면서 오래전에 수업시간에 교수님께서 물어보셨던 사항이었습니다.
그 당시 저는 배열도 인덱스값을 통해서 특정 인덱스에 저장 된 값은 해당 배열에 접근해서 가져올 수 있고.. 포인터도 주소값을 가리킴으로써 앰퍼샌드로 값을 가져올 수 있으니까... 비슷한데 근데 느낌상 아니란말이야.. 라고 고민 한 적이 있었습니다. 그럼.. 간단하게 정리 해 보겠습니다.

  1. 포인터는 변수입니다. 그리고 배열은 상수입니다.
    => 예를들어 int p 가 있고, int arr[10] 이 있다면, p는 포인터형으로 무엇을 가리키던 상관이 없습니다. int a = 10이 있고, int b = 20이 있다고 가정 해 본다면, int p = &a; 가 되던, int *p = &b가 되던 상관이 없습니다. 이제 배열로 보자면, [1,2,3] 이 있습니다. 인덱스 0번부터 1이 들어가겠지요. arr[0]이 1이지, 2나 3이 되진 않습니다.

  2. 포인터는 동적으로 크기를 할당 할 수 있습니다.
    => arr의 경우 arr[10] 이라고 주어지면 그냥 arr 자체의 길이는 10이 될 뿐, 여기서 더 늘리거나 줄일 수 없습니다. 포인터의 경우 malloc 과 calloc 처럼 동적으로 할당 할 수 있기때문에 길이를 늘리거나 줄일 수 있습니다. c++ 의 경우 new와 delete를 사용하기도 합니다. (근데 속도가 느린편..)

결국 메모리 복사과정을 거치지 않고 호출하기 위해 포인터를 사용한다 라는 말이 중요한 핵심인 것 같습니다. 왜냐하면 속도가 빠르기 떄문이지요.

다음에 포인터를 포스팅 한다면, 조금 더 심화있는 내용으로 정리 할 예정입니다.

profile
C++ 공부하고있는 대학생입니다.

0개의 댓글