작은숲:위키노트/초보자를 위한 C 언어 강의/포인터: 두 판 사이의 차이
잔글 문자열 찾아 바꾸기 - "</source>" 문자열을 "</syntaxhighlight>" 문자열로 |
잔글 문자열 찾아 바꾸기 - "\[\[분류:공유(\|.*?)?\]\]" 문자열을 "분류:위키노트/공유$1" 문자열로 |
||
| 28번째 줄: | 28번째 줄: | ||
[[위키노트:C 언어|C 언어]]를 사용할 때는 항상 기억하자. 포인터는 주소를 저장하는 변수다! | [[위키노트:C 언어|C 언어]]를 사용할 때는 항상 기억하자. 포인터는 주소를 저장하는 변수다! | ||
{{초보자를 위한 C 언어 강의}} | {{초보자를 위한 C 언어 강의}} | ||
[[분류:공유]] | [[분류:위키노트/공유]] | ||
[[분류:C 언어]]{{퍼온문서|위키노트|{{#invoke:string|replace|위키노트:|}}}}[[분류:위키노트에서 가져온 문서]] | [[분류:C 언어]]{{퍼온문서|위키노트|{{#invoke:string|replace|위키노트:|}}}}[[분류:위키노트에서 가져온 문서]] | ||
2021년 3월 28일 (일) 13:53 판
C 언어를 공부하면서 가장 이해하기 힘든 부분이 바로 포인터가 아닐까 생각한다. 다른 언어에는 없는 개념이기 때문에 포인터를 이해하는 것이 쉽지는 않다. 우선 포인터를 이해하기 위해서는 메모리가 논리적으로 구획이 나누어져있으며, 그 각각의 구획마다 주소가 있다는 것을 알아야 한다. 보통 한 구획은 1바이트이다. 현실 세계와 비교해 보자. 우리나라 땅덩이들도 모두 주소가 있다. 일정 구획을 나눠 번지를 붙여준다. 이와 마찬가지로 메모리에도 각 구획에 모두 주소가 있다. 포인터라는 것이 바로 이 주소를 저장하는 변수이다. 포인터도 변수이다. 일반 변수는 값을 저장한다. 하지만 포인터는 주소를 저장한다. 그런데 왜 주소를 알아야 할까? 이건 지금 당장은 구체적으로 대답하기가 조금 힘들다. C 언어로 프로그래밍을 하다보면 종종 이 주소를 알아야 할 경우가 있다. 대표적인 예가 scanf() 함수가 있다. 앞으로 차차 이러한 것들이 어떤 것들이 있나 살펴보기로 하자. 그렇다면, 일반 변수는 주소가 없나? 그건 아니다. 일반 변수도 메모리 내에 어딘가에 저장된다. 메모리 내에 저장이 된다는 말은 그곳의 주소를 알아낼 수 있다는 말이다. 보통의 경우, 우리는 그 주소를 알 필요가 없다. 예를 들어,
int i = 10, j = 20, k;
k = i + j;여기에서 세 개의 변수를 사용했다. 우리가 이 변수들을 사용할 때는 이 변수들이 어디에 저장되는지 그 주소를 알 필요는 없다. 그냥 i, j, k라는 이름을 써서 변수에 저장된 값을 쓰면 된다. 하지만 어떤 경우에는 i 변수가 사용하는, 즉 i 변수의 값이 저장되는 메모리의 주소를 알아야 할 때가 있다. 그럴 때는 주소 연산자(&)를 사용해서 알아낼 수가 있다.
&i;이것은 바로 변수 i가 사용하는 메모리의 주소이다. 위에서 변수는 값을 저장하지만 포인터는 주소를 저장한다고 했다. 그럼 아래와 같이 쓸 수 있다.
int i = 3;
int *ptr = &i;이렇게 하면 포인터 변수 ptr에는 변수 i의 값이 아닌 주소가 저장되어 있다. 개인적으로는 이걸 보고 "포인터 ptr이 i를 가르킨다"라고 말한다. 그럼 이 포인터를 가지고, i의 값을 변경시킬 수 있을까? 물론 가능하다. 주소를 가르킨다는 것은 그 주소에 저장되어 있는 값을 참조하거나 변경할 수도 있다는 말이 된다.
*ptr = 4;위와 같이 포인터 변수 앞에 참조 연산자(*)를 붙임으로써 가능해진다.
여기서 한 가지 짚고 넘어갈 것은, 포인터 변수를 선언할 때의 *과 참조 연산자 *은 분명 다른 것이다. 포인터 변수를 선언할 때 붙이는 것은 "이 변수가 포인터다"라고 알려주는 것이고, 참조 연산자는 포인터 변수에 저장된 주소에 저장된 값, 즉 포인터가 가르키는 곳에 저장된 값을 참조한다는 말이다.
그럼 저 위의 코드는 무슨 말일까? 코드를 말로 풀어 쓰면, "포인터 변수 ptr이 가리키는 곳의 값을 4로 바꿔라"고 할 수 있다. 즉, 위에서 포인터 ptr에 i의 주소를 저장시켜놨기 때문에 저렇게 하면 i의 값이 바꾸는 것과 동일한 효과가 나온다.
C 언어를 사용할 때는 항상 기억하자. 포인터는 주소를 저장하는 변수다!