-
[삼쾌한 IT강의] 포인터C언어/이론 2019. 1. 27. 01:53
안녕하세요! 삼쾌한 IT강의 백소라 강사입니다.
이번 포스팅에서는 C언어의 꽃! 포인터에 대해 다루도록 하겠습니다.
1. 포인터란?
포인터라는 개념은 개의 종중 하나인 포인터에서 나왔어요. 우리가 딱 봐도 포인터는 어딘가 가리키는 역할을 한다는걸 직감적으로 알 수 있을텐데요. 포인터라는 종의 개도 사냥개이긴 한데 사냥감을 직접 사냥하진 않고 사냥감의 위치를 가리키는 개라고합니다.
컴퓨터에서 포인터의 역할도 마찬가지입니다. 데이터를 직접 가지고 있는것이 아닌, 데이터가 저장되어있는 위치를 가리킬뿐이죠. 즉 포인터 자체는 우리가 다루고자하는 데이터가 아니고 데이터가 위치한 메모리 주소를 나타냅니다.
2. 포인터 변수의 선언
포인터 변수의 선언도 일반 변수의 선언과 크게 다른점은 없습니다.
자료형 *변수이름;
int *ptr;
int *ptr1, *ptr2;
char *ptr3;
변수이름 앞에 * 이라는 참조연산자를 써준게 다에요. 그런데 여기서 의문점이 들겁니다. 포인터는 데이터를 직접 가지고있지 않고 데이터를 '가리킨다'고 했는데 왜 포인터 변수이름 앞에 자료형을 써줄까? 그 이유는 포인터변수는 어떤 자료형을 가리키든 상관없이 똑같은 크기를 가지고있기 때문입니다. 그래서 포인터가 가리키는 데이터가 궁극적으로 어떤 자료형인지, 얼마만큼의 크기를 할당해 줘야할지 알기위해 포인터 변수 앞에도 자료형을 써줘야하는거죠.
3. 포인터 변수의 초기화
포인터 변수를 어떻게 초기화하는지 보기전에! 한번 생각 해 볼까요? 우리가 scanf로 사용자에게 어떤 값을 받아줄 때 아래처럼 해줬었죠.
int num;
scanf("%d",&num);
변수 앞에 &를 붙여준게 보이시나요? 우리가 정수라는 수를 받아준다고 할 때 정수형 자료형인 int는 %d라는 전용 그릇에 담기는데 그 그릇이 가지고 있는 '주소'를 알려주기 위해 num이라는 변수 앞에 &를 붙인다고했어요. 이렇게 변수 앞에 &를 붙이면 그 변수의 주소를 나타내줍니다.
앞에서 포인터 변수가 데이터를 직접 가지고있지 않고 위치를 가리킨다고 했었죠? 다른 변수의 주소를 가리킨다고 보시면 됩니다. 아래 예시를 한번 볼까요?
int i = 5;
int *ptr = &i; //변수 i의 주소값은 &i 입니다.
//포인터 변수 ptr은 i의 주소값을 가리킵니다.
i라는 변수의 주소값 즉 &i가 0x100이라고 가정하면, 0x100이라는 주소에 5라는 정수가 담겨있습니다. 그리고 ptr 포인터 변수가 &i 즉 i의 주소 0x100을 가리키고 있다고 보면되겠죠.
그런데 포인터 변수를 선언하면서 가리킬 대상이 없는 경우에는 무조건 NULL이라는 값을 대입 해 주는것이 좋습니다. 포인터가 엉뚱한 곳을 가리키지 않게 미리 예방하는거라고 보시면 됩니다.
int *ptr = NULL;
4. * 연산자의 이해
위에서 포인터를 선언해줄 때 * 을 써서 포인터 변수라는걸 나타낸다고 했었죠? 그런데 이게 참 헷갈리게 포인터 변수를 선언해준 후에도 사용이됩니다. 변수 선언을 해줄 때 써주는 *연산자와 변수 선언 이후에 써주는 *연산자의 역할은 전혀 다릅니다. 위의 예제를 다시 가지고 와볼까요?
int i = 5;
int *ptr = &i; //포인터변수 ptr이 i의 주소를 가리킵니다.
*ptr = 10; //포인터변수 ptr이 가리키고 있는 i의 값에 10을 대입합니다. ( == i = 10;)
포인터 변수 선언 후에 쓰이는 *연산자는 포인터 변수가 가리키고 있는 위치에 저장된 값을 나타냅니다. 위의 예제에서 ptr포인터 변수는 i의 주소값을 가리키고있죠. 세번째 줄의 *ptr은 i의 주소값이 가지고있는 데이터를 나타낸거라고 보시면 됩니다.
이번 포스팅에서는 & 연산자와 * 연산자의 역할에 대해 이해를 하셨으면 성공을 한거라고 생각합니다. 그럼 실습예제 링크를 걸어두고 포스팅을 마무리하도록 하겠습니다!
2019/01/27 - [C언어/실습예제] - [삼쾌한 예제] C언어 포인터 예제
이상 유쾌,상쾌,통쾌 삼쾌한 IT강의, 백소라 강사의 C언어 포인터에 대한 설명이었습니다.
내용이 도움이 되셨다면 공감버튼 클릭, 댓글은 센스! 감사합니다.
'C언어 > 이론' 카테고리의 다른 글
[삼쾌한 IT강의 ]구조체와 연결리스트 (0) 2019.02.15 [삼쾌한IT강의] C언어 문자열 길이, 문자열 복사, 문자열 연결, 문자열 비교 (0) 2019.01.27 [삼쾌한IT강의] 배열과 문자열 (0) 2019.01.27 [삼쾌한IT강의] C언어 2차원 배열 (0) 2019.01.26 [삼쾌한IT강의] C언어 배열의 선언과 초기화 (0) 2019.01.26 댓글