C 프로그래밍 입문/포인터: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
Joshuajh (토론 | 기여)
 
Joshuajh (토론 | 기여)
12번째 줄:
 
===== 기본 포인터 =====
 
'변수 = 메모리 공간'이고 '포인터 = 메모리 공간의 주소를 저장하는 변수'이었으니, 결국 포인터는 '변수의 위치를 저장하는 변수'라는 의미가 된다. 그럼 아래 코드를 잠시 보자:
 
<div style='border: dashed 1px #0000ff; background: #f0f0ff; padding: 7px; margin: 10px 0px 10px 0px;'>
<source lang="c" line="GESHI_NORMAL_LINE_NUMBERS">
#include <stdio.h>
int main (int argc, char * argv[])
{
int var = 10;
int *vp = &var;
 
printf("The value of pointer: %x\n", vp);
printf("The value before: %d, %d\n", var, *vp);
var = 20;
printf("The value after: %d, %d\n", var, *vp);
*vp = 30;
printf("The value then: %d, %d\n", var, *vp);
return 0;
}
</source></div>
 
5번 라인에서 vp라는 변수를 선언하면서 변수의 이름 앞에 '''*''' (별표; asterisk)가 붙어있는 걸 볼 수 있다. 실상 이 별표는 타입의 일부로 'int *' 가 하나의 타입이 된다. 'int *'의 의미는 '정수값을 저장하는 메모리 공간의 주소를 저장할 수 있는 변수'이다. 다음과 같은 이유에 의해 '주소가 저장되는 변수'임에도 불구하고 일반적인 변수의 타입이 추가로 붙는다.
 
<div style='border: dashed 1px #ff0000; background: #fff0f0; padding: 7px; margin: 10px 0px 10px 0px;'>
# 변수에 타입이 있는 이유는 변수에 저장되어있는 데이터를 처리할 방법을 컴파일러에게 알려주기 위함이다.
# 포인터 변수에 주소를 넣는 이유는 그 주소 자체가 필요 해서가 아니라 주소에 해당되는 메모리 공간에 저장되어있는 데이터가 필요해서 이다.
# 결국 포인터 변수에 타입이 존재하는 이유는 포인터 변수에 저장되어있는 주소위치에 있는 데이터를 처리할 방법을 컴파일러에게 알려주기 위함이다.
</div>
 
또한 5번 라인에서 vp에 값을 대입할 때 '''&''' 연산자를 사용하는 것을 볼 수 있다. '''&'''는 레퍼런스 연산자(reference operator)라 부르며, 변수의 주소를 알아내는데 사용된다. 결국 5번라인은 '정수형 포인터 vp를 만들고, var의 주소를 알아내서 vp에 저장한다' 라는 의미가 된다.
 
반복해서 설명 되었듯이 포인터는 메모리 주소 - 메모리 공간의 일련번호 이다. 결국 vp에 저장되는 값은 실제로는 정수값 이다. 그렇기 때문에 7번라인에 보는 것 과 같이 그 값을 인쇄해 보면 정수값으로 인쇄된다.
 
8, 10, 12번 라인에 걸쳐서 변수 vp 앞에 * 연산자가 붙어있는 것을 볼 수 있다.<ref>이것은 비록 같은 문자를 사용하지만 5번 라인에서 사용한 타입 한정자인 * 와는 전혀 다릅니다. 당연히 곱셈 연산자도 아닙니다 :).</ref> * 연산자는 포인터 연산자라고 하며, 포인터변수에 저장되어있는 메모리 주소에 해당되는 메모리 공간에 저장되어있는 값을 액세스 하려는 경우에 사용된다. 변수 vp에는 변수 var의 주소가 저장되어 있으므로 결국 *vp를 통해 액세스되는 데이터는 var를 통해 액세스 되는 데이터와 동일하다. 9번과 11번 에서보면 var를 수정해서 보여지는 결과난 *vp를 통해서 수정해서 보여지는 결과나 같은 것을 보면 유추가 가능할 것 이다.
 
===== 배열 포인터 =====