와.. 여기까지 오신 여러분 수고 많으셨습니다.
이제부터 C언어에서 가장 어려운 개념인 포인터에 대해 공부할건데요
(솔직히 진심으로 포인터 강좌하기 싫어서 내일할까 하고 미루려다가 한번 미루기 시작하면
끝도없이 미룰게 포인터인것같아서 그냥 꾹 참고 강좌 해보려구요)
서론을 좀 길게 해보자면 포인터에는 스토리가 있습니다.
제가 프로그래밍을 배우러 다녔을때 처음에 학생수가
한 반에 15명으로 시작했어요 그중에서 두명정도가
지금까지 여러분이 배우신것들을 배우면서 너무 자기랑 안맞는것 같다고
중도 포기를하고 나가버리시더군요..
그리고나서 이제 포인터를 시작하는데 프로그래밍 선생님이 포인터 시작하면 아마 많은학생들이
포기할것이다 라고 예언을하셨고 저는 그래도 '에이.. 지금도 13명인데 나가봐야 또 한두명 나가겠지'
하고 생각했습니다. 그런데 아니나 다를까 포인터를 다 배우고나서 교실을 둘러보니
5명남았더군요.. 와..진짜 포인터 배우니까 다 포기하더라구요ㅋㅋㅋ
그 5명중에 4명은 전부 게임프로그래머로 일하고있답니다.
취업못한 한명도 군대가신거뿐이지 전역하시면 바로 취업할수있을정도구요!
여러분도 포기하지 마시길 바라며 한번 배워보도록 하겠습니다
'*' 여러분은 이게 뭐로보이시나요?
곱셈연산자요? 뭐.. 맞습니다! 하지만 또 다른 의미가 있는데요
바로 "포인터"입니다 오늘 배울 내용이 바로 이 "포인터"에 있습니다.
포인터란 '주소' 라고 보시면 되는데요
자 우리에게는 메모리가 있습니다.
그 메모리를 사용해서 변수를 만들기도 하고 그러는데요!
변수를 만들면 그 변수에게 내 메모리 공간을 주고
"자 여기는 네 공간이니까 자유롭게 값을 저장해" 라고 해주는거라고 보시면 됩니다.
그렇다는 말은 메모리 어딘가에는 그 변수만의 공간이 있겠죠?
그런 메모리의 위치를 표현할수있는 주소가 있고 그 메모리 주소를 "포인터"라고 부릅니다.
자 그럼 이번에는 배열에 대해 알아보겠습니다.
사실은 배열은 포인터입니다.
배열의 구성을 한번 알아볼까요?
배열은 연속된 메모리의 주소로 이뤄집니다
예를들어 길이가 5인 int형 배열이고 배열의 첫번째 요소의 주소가 120718번이라면
이런식으로 이뤄져있고 배열은 배열의 첫번째 요소의 주소
즉 120718입니다. 우리가 쓸때 arr[3]이런식으로 썼다면
arr이 120718이므로 여기서부터 3번째요소인 120730주소
안에있는 값을 돌려주는것입니다
그래서 배열은 포인터다 라고 말할수 있는겁니다.
포인터를 표현하는방법은
자료형 * 변수이름;
이렇게하면 포인터변수를 만들수있습니다.
예를들어
int * ptr;
이렇게 했다면 int형 ptr이 아니라 int의 포인터형 ptr 이라고 부를수있는겁니다.
자 그럼 배열은 포인터다 라는것을 증명할수있을까요 다음 코드를 보죠
#include <stdio.h>
int main()
{
int arr[5] = {3,4,5,6,7};
int * ptr = arr;
printf("%d",ptr[3]);
}
이 코드를 실행해보겠습니다.
설명을 하자면 길이 5의 int형 배열을 선언하고 3,4,5,6,7로 할당합니다.
그럼 어차피 arr은 첫번째요소 3의 주솟값을 의미하게되고
그 주솟값을 ptr변수에 할당하고
ptr의 세번째 요소를 출력합니다. 즉 arr[3]과 ptr[3]은 같은명령이라고 볼수있는거죠
실행해볼까요?
자 이렇게 배열 = 포인터다 라는것이 증명되었네요
그럼 배열이 아닌 일반 변수의 포인터를 얻어보겠습니다
바로 &연산자 어드레스 연산자인데요!
어드레스 연산자는 주소값을 얻어주는 기능을 합니다
아래 코드를 보시죠!
#include <stdio.h>
int main()
{
int a = 12;
int * ptr = &a;
}
이렇게 해주면 ptr은 변수 a의 주소값을 가지고있게 되고
이를 "ptr이 a를 참조한다" 라고 말합니다.
자 그럼 이렇게 주소를 받았다고 칩시다.
저 상태에서 ptr = 0; 이렇게 해주면 과연
a가 0으로 바뀔까요?
아니요, ptr = 0;이라는 코드를 넣으면
ptr이 가리키는 주소값을 0으로 바꾸라는 의미입니다.
그럼 ptr이 가지고있는 주소에 접근하려면 어떻게 해야하나요?
바로 *을 사용하면 됩니다
#include <stdio.h>
int main()
{
int a = 12;
int * ptr = &a;
*ptr = 0;
printf("%d",a);
}
이런식으로 주소값 앞에 포인터표시 *를 붙혀주면 그 주소안의 값을 사용하겠다
라는 뜻이 됩니다!
그러니 printf로 출력되는 a의 값은 0이 돼있겠네요!
이렇게말이죠!
앞으로 몇강동안은 포인터에 대한 설명을 다루게 될것같습니다.
오늘 내용 확실히 이해하시고 나서 다음강으로 넘어가시길 바라며
1차적인 포인터의 개념에 대한설명을 마치겠습니다
'C' 카테고리의 다른 글
([C언어] 17강) 포인터의 포인터와, 포인터의 메모리크기 (0) | 2019.06.28 |
---|---|
([C언어] 16강) Call by value와 Call by reference (0) | 2019.06.28 |
([C언어] 14강) 함수의 생성과 반환값 (0) | 2019.06.27 |
([C언어] 13강) sizeof연산자로 배열 길이 구하기 (0) | 2019.06.27 |
([C언어] 12강) define과 하드코딩 (0) | 2019.06.27 |