안녕하십니까? 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
가 출력될것입니다.
왜 이렇게 나오는지 이해가 되셧나요? 제가 알려드린것은 포인터의 기초중의 기초입니다.
다음 강좌는 오늘 알려드린것을 응용해보겠습니다.