코드 여행자
포인터(Pointer) - 기본1 본문
포인터 변수 기본 개념
코드
#include<stdio.h> int main() { int a; printf("value of a = %d\n",a); printf("address of a = %p\n",&a); a = 10; printf("value of a = %d\n",a); printf("address of a = %p\n",&a); printf("size of a = %lu\n",sizeof(a)); return 0; }
실행 결과
value of a = 1 address of a = 0x7ffee70f7b3c value of a = 10 address of a = 0x7ffee70f7b3c size of a = 4 |
포인터와 포인터 변수
포인터 변수의 정의
포인터 변수의 사용
#include<stdio.h> int main() { int a; a = 5; printf("value of a = %x\n",a); printf("address of a = %p\n",&a); printf("size of a = %lu\n",sizeof(a)); int * temp = &a; printf("address of temp = %p\n",&temp); printf("size of temp = %lu\n",sizeof(temp)); printf("value of temp = %p\n",temp); printf("dereference temp = %d\n",*temp); return 0; }
실행결과
value of a = 5 address of a = 0x7ffee13eab38 size of a = 4 address of temp = 0x7ffee13eab30 size of temp = 8 value of temp = 0x7ffee13eab38
dereference temp = 5 |
그림 3은 변수 a와(주황색 가지) 포인터 변수 temp(파랑색 가지)의 메모리 상태를 표시한 그림입니다.
그림 4는 그림3을 간단하게 표현한 그림입니다.
그림 3에 나타나 있듯이 integer 변수 a 에는 정수 5가 저장되어 있습니다. 그리고 변수 a의 메모리 시작 주소는 7ffee13eab38 입니다.
integer형의 temp 포인터 변수를 선언하고 변수 a의 주소 값을 대입하면 그 포인터 변수는 7ffee13eab38 값을 가리키게 됩니다.
이때 시스템은 7ffee13eab38값을 temp 변수가 할당하고 있는 8바이트 공간에 저장합니다.
temp 변수도 메모리 어딘가에 자리 잡고 있습니다. &temp 를 사용하여 주소값을 확인할 수 있습니다. 실행결과를 보면 temp 변수의 메모리 주소는 0x7ffee13eab30입니다.
다시 말해 temp는 변수 a의 주소를 가리키고, &temp는 자기 자신의 메모리 주소를 가리킵니다.
메모리 상에서 변수 a는 4바이트를 차지하고 temp 포인터 변수는 8바이트를 차지하므로
시스템은 변수 a값을 읽을 때는 변수 a 메모리 시작주소부터 4바이트에 저장되어 있는 값을 읽어옵니다.
그리고 temp값을 읽을 때는 temp 변수의 시작주소부터 8바이트에 저장된 값을 읽어 옵니다.
그림 3에서 보듯이 temp 변수가 차지하는 8개의 바이트에는 0x0 0x0 0x7f 0xfe 0xe1 0x3e 0xab 0x38값들이 저장되어 있습니다.
이를 자릿수 감안하여 계산하면 0x7ffee13eab38 입니다. 이 값은 변수의 a의 메모리 주소와 동일합니다. int * temp = &a 를 하였기 때문입니다.
그림 4를 보면 *temp는 temp가 가리키는 주소(즉 , 변수 a의 주소)에 저장되어 있는 값을 역참조 합니다.
temp는 변수 a를 가리키므로(temp == 0x7ffee13eab38) 역참조한 값은 변수 a의 값인 정수 5입니다.
지금까지 포인터 변수의 기본적인 내용에 대해서 알아 보았습니다.
다음에는 이번 글에서 다 설명하지 못한 남은 부분에 대해서 설명 드릴 예정입니다.
예를 들면 포인터 변수를 사용하여 역참조된 값을 수정하는 것, 그리고 포인터 변수를 사용하는 이유에 대해서 설명 드리겠습니다.
'포인터(Pointer) 변수' 카테고리의 다른 글
배열과 포인터(Array and Pointer) (0) | 2019.11.11 |
---|---|
포인터 기본2- call by reference (0) | 2019.11.03 |