본문 바로가기

Programming/C/C++

[C] C언어에서의 포인터 -1강(기초)

안녕하십니까? M1S Secur 입니다.



많은 분들이 C언어를 공부하면서 막히거나 가장 어려워하는곳이 '포인터' 인데요, C언어 전공한지는 꽤 됬지만 기억을 되살려 조금이라도 도움을 드리고자 작성해봅니다.


포인터에서의 변수


일단 기본적인것은 아래를 봐주세요.


int num=5;

int * ptr;

ptr=#


위 코드를 보시면 첫줄에선 정수 5가 저장된 변수 num을 선언했고 두번째줄에선 포인터 변수인 ptr을 선언했습니다.


이해가 빠르신분들은 포인터 변수의 선언인 int * ptr 에서 int * 이 int형 변수의 주소값을 저장하는 포인터 변수의 선언이란것과 ptr이 포인터 변수의 이름이란걸 눈치채셧을겁니다. ( *의 위치는 상관이 없습니다.)


그리고 세번째줄은 num의 주소 값을 변수 ptr에 저장시키다, 즉 &는 오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자 입니다. &연산의 결과로 변수 num의 주소값이 반환되며, 이를 포인터 변수인 ptr에 저장하게 됩니다.


포인터 형(Type)


int, char, double 등과 같이 변수의 선언 및 구분에 사용되는 키워드를 '자료형' 이라 하듯이 포인터 변수의 선언 및 구분에 사용되는 int*, char*, double* 등을 '포인터 형' 이라 합니다.

아래를 보시면


type * 이것은 type 형 포인터

type * ptr; 이것은 type형 포인터 변수인 ptr 입니다.


연산자


첫번째로 &연산자를 설명해드리겠습니다. 먼저 아래를 봐주세요.


int num=5;

int * ptr=#

이것은 &연산자로, num의 주소 값을 반환해서 포인터 변수인 ptr을 초기화시켜줍니다.

여기서 중요한건 &연산자의 피연산자는 변수이어야합니다. 상수는 될수가 없죠.


두번째로 *연산자는 포인터가 가리키는 메모리 공간에 접근할 때 사용됩니다.


int num=5;

int * ptr=#

*ptr=10;


*ptr=10; 이 보이시죠?

 ptr이 가리키는 num에 10을 저장하라는 것입니다. 왜냐구요? 위에서 * 연산자는 포인터가 가리키는 메모리 공간에 접근할 때 사용된다 했죠? ptr은 포인터 변수이니 ptr(포인터)가 가리키는 메모리 공간인 num에 접근하여 10을 저장해 이것입니다.


좀 더 쉬운 이해를 위해 간단한 소스코드를 작성해봅시다.


#include <stdio.h>


int main(void)

{

int num1=10, num2=10;

int * ptr;


ptr=&num1;

(*ptr)+=20;


ptr=&num2;

(*pnum)-=5;


printf("num1 : %d, num2 : %d \n", num1, num2);

return 0;

}


이것을 작성하고 실행해보면


num1 : 30, num2 : 5


가 출력될것입니다.


왜 이렇게 나오는지 이해가 되셧나요? 제가 알려드린것은 포인터의 기초중의 기초입니다.


다음 강좌는 오늘 알려드린것을 응용해보겠습니다.