참고자료

아두이노, 오렌지보드 등의 오픈소스하드웨어를 사용하는데 필요한 것들을 알아봅니다.

포인터

2014-08-14 11:29:28

포인터란?

포인터(Pointer)


포인터는 C언어의 대표적인 특징으로 메모리의 접근이 가능하게 하는 기능이다.
많은 컴퓨터 전공학생들이 C언어를 배울 때 좌절하게 하는 문법(포인터에서 한번 좌절하고 클래스에서 또 한번 좌절한다)으로 한번 헷갈리기 시작하면 끝도 없이 헷갈리게 된다.
반대로 말하면 포인터를 제대로 이해하고 사용할 수 있으면 C언어를 정말 제대로 쓸 수 있는 프로그래머가 될 수 있다.

자바에서는 포인터의 개념이 없기 때문에 포인터가 정 어렵다면 '나 이거 몰라요' 하면 그만이지만
아두이노에서는 쓰이기 때문에 쓸 정도로 익히지는 못하더라도 개념은 알고 가야 소스이해에 도움이 된다.

포인터라는 개념이 어떤 것인지는 이해는 되지만 막상 소스를 보면 머릿속이 복잡하기 그지없기 때문에(소스만 봐도 머리 아픈데 메모리 주소까지 이해해야 한다)
짧고 간단하게 설명하고 끝내도록 하겠다.

포인터는 앞에서도 잠깐 말했듯이 특정 값이 아닌 그 값이 들어있는 주소를 저장하는 변수를 지칭한다.

 

포인터의 선언 방법

포인터의 선언은  

 

 

int* a;
int * a;
int *a;

위 3가지 방법 모두가 같은 선언방법에 해당한다. 3가지 중 어떤 것을 쓸 것인지는 프로그래머 마음이다.
중요한 것은 *가 존재하냐 없느냐이다. *이 쓰이게 되면 포인터로 사용하겠다! 라는 의미가 된다.
이렇게 선언하게 되면 변수 a에는 이제 메모리의 주소가 저장되게 된다.

 

 

포인터의 사용

int a = 999;
int *pointerA;
pointerA = &a;

벌써 기호가 2개 나왔다. *와 &
*는 아까 말했듯이 포인터를 선언할 때 쓰이는 기호이다. &는 변수 앞에 쓰여서 그 변수의 주소를 가져오겠다는 의미의 기호이다.

위 소스를 해석하면 변수 a에는 999라는 값이 들어가게 되고 pointerA라는 포인터가 생성된다. pointerA에는 999라는 값이 저장되어있는 변수 a의 주소가 저장된다.
위 소스가 포인터 사용의 기초이다.

 

포인터가 가리키는 공간의 값 읽어오기

포인터에 변수의 주소를 저장하는 방법을 알았으면 포인터를 통해 그 변수값을 읽어오는 방법을 알아보자.

int *pA;
int a = 999;
int b;
int adrA;
int pA = &a; //포인터에 a의 주소를 저장
int b = *pA; //b라는 변수에 pA가 가르키는 공간에 있는 값을 저장
int adrA = pA; //a의 주소값을 adrA에 저장

4번째 줄까지는 앞에서 했으니 이해가 갈 것이다. 
5번째 줄의 문장이 포인터가 가리키는 곳에 있는 값을 불러오는 문장인데 포인터 변수앞에 *를 붙이게 되면 포인터가 가리키는 공간에 접근할 수 있어진다.
만약 그냥 int b = pA라고 썼으면 b에는 변수 a의 값이 저장된 공간의 주소값이 저장돼있었을 것이다. 하지만 *pA를 써서 pA가 가리키는 공간의 있는 값을 저장하였다.
adrA에는 a의 주소값(포인터 pA의 값)이 저장된다.

 

포인터와 배열

배열을 그냥 똑같은 데이터형의 여러 개의 값을 저장하는 변수라고 생각하고 있을지 모르겠지만, 배열은 포인터의 개념을 잘 사용하고 있는 좋은 예이다.

arr[10]을 선언하였을 경우 arr은 변수가 아닌 각 값이 저장된 공간의 주소를 가지고 있다. arr[10]이면 메모리상에서 일렬로 10개의 공간을 차례대로 차지하고 있는 것이다.

int *pA = arr;이라고 선언할 경우 포인터 pA에는 배열 arr의 처음주소(arr[0])가 저장된다. 배열의 인덱스값을 정하지 않아도 포인터만 가지고 각각의 배열에 접근할 수 있다.

char arr[5] = "HELLO";
char a, b, c;
char *pArr;
pArr = arr;

a = *pArr; //a = arr[0]
b = *(pArr+1); //b = arr[1]
c = *(pArr+2); //c = arr[2]

cout << a <<" "<< b <<" "<< c <

다음과 같이 입력하게 되면 H E L이라고 출력이 나올 것이다.
배열 arr은 주소값을 가지고 있기 때문에 포인터에 주소값을 옮겨서 포인터를 통해 주소를 이리저리 옮겨도 배열의 접근이 가능해진다.
pArr+1을 하게 되면 배열의 인덱스를 +1한것과 같은 효과를 주게 된다. 배열이 메모리를 차례대로 가져가기 때문에 이런 접근이 가능해 지는 것이다.
배열의 값을 불러오기 위해서 포인터 변수 앞에 *를 붙여서 각 변수에 저장하게 되면 배열의 값을 불러올 수 있게 된다.
 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

포인터, 기타