1. 변수의 포인트(주소) 알아내기
C언어의 가장 큰 특징이자, 장점이자, 단점인 포인터에 대해서 알아보자. 포인터(Porinter)란 말 그대로 풀이하면 ‘지정자’가 될 것이다. 요즘 흔히들 많이 쓰는 레이저 포인터를 생각하면 이해가 될 것이다. 풀어 애기하자면 컴퓨터 메모리 상의 특정 위치를 가리키는 변수가 바로 포인터이다. 아래는 정수형 변수의 포인트 값(메모리상의 주소)을 포인터에 저장하는 예이다.
int num = 10; // [0][0][0][10] : 4바이트 정수형 변수
int* ptr = # // ^ 의 주소를 포인터(ptr)에 저장
먼저 'num' 이라는 변수에 10이라는 수를 저장한다. ‘num’ 이라는 정수형 변수는 곧 4바이트 크기를 가진 저장공간(메모리)이다. 이 저장 공간의 실질적인 주소(메모리상의 위치)는 어떻게 될까? C에서는 이것을 알 수있는 방법을 제공한다. 바로 일반 변수 앞에 ‘&’를 붙히는 것이다. ‘num’ 변수 앞에 ‘&’를 붙여 ‘&num’ 이라고 표시하게되면 변수 ‘num’의 실질적은 주소값을 알려주게 된다. 이 방식은 어떠한 타입의 변수에게도 적용될 수 있다.
#include <stdio.h>
int main()
{
int num = 10;
printf("value of num is %d\n",num); // num 의 값
printf("address of num is %p\n", &num); // 64비트 num의 주소 16진수.
}
2. 포인 터(Pointer)
지금까지 변수의 주소를 알아내는 법을 알아봤다. 그럼 이 주소는 어떻게 저장할 수 있을까? 이 주소를 저장하는 타입이 바로 포인터 타입이다. 이 포인터 타입을 이용해 선언한 변수를 포인터라고 부른다. 포인터를 선언하는 방법은 일반 타입 뒤에 ‘*’를 붙이고 변수 명을 정해주면 된다.
int num = 10;
int* num_ptr; // int 타입의 포인터 변수 선언.
num_ptr = # // num의 포인트 값(주소)을 포인터인 num_ptr 에 저장
다시 알기 쉽게 정리하자면 예를 들어 어떤 건물이 있다고 하자. 그 건물의 이름(변수명)이 ‘코엑스’다. 그 건물의 주소(포인트)는 ‘서울 강남구 영동대로 513’ 다. 코엑스 내에 관람객수는 현재 1000명이다. 이를 코딩으로 표현해 보면 다음과 같다.
int 코엑스 = 1000; // '코엑스'의 현재 관람객수 천 명.
int* 주소 = &코엑스; // ‘주소’는 ‘서울 강남구 영동대로 513
3. 포인터의 값(내용) 알아내기
그렇다면 여기서 저 주소만 가지고 그 장소의 값(관람객수)를 알 수는 없을까. 방법이 있다. 포인터 변수 앞에 ‘*’를 붙이는 것이다.
int 코엑스 = 1000; // 현재 관람객수는 천 명.
int* 주소 = &코엑스; // 코엑스의 ‘주소’는 ‘서울 강남구 영동대로 513'
int 관람객수 = *주소; // 포인터 변수인 ‘주소’가지고 있는 값(1000)을 내어준다.
// 주의. 포인터 원래 타입과 새로운 변수의 타입이 맞아야 한다.
printf("관람객수는 %d\n", 관람객수); // 결과 : "관람객수는 1000"
* 참고로 C에서는 한글 변수명을 허락하지 않는다. 여기선 여러분의 이해를 돕기위해 한글로 표현한 것 뿐이다.
여기서 포인터 변수앞에 붙는 ‘*’ 는 포인터에 저장된 실제 값을 타입에 맞춰 알아내는 기능을 한다.
일반 변수 앞 ‘&’ : 변수의 주소(포인트)를 알아냄. 예) &num
포인터 변수 앞 ‘*’ : 포인터에 저장된 값을 알아냄. 예) *num_ptr
다음의 예제는 지금까지 배운 포인터의 다양한 활용법을 모두 적용해 보았다.
#include <stdio.h>
int main()
{
int num = 10;
int* num_ptr; // 포인터 변수 선언
num_ptr = # // num의 포인트를 포인터에 저장
int new_num = *num_ptr; // 포인터에 내용을 정수형 변수에 저장
printf("num is %d\n",num);
printf("address of num is %p\n",&num);
printf("address of int_ptr is %p\n",num_ptr);
printf("new_num is %d\n",new_num);
}
'프로그래밍 언어 > C' 카테고리의 다른 글
[C언어:초급-012] 배열과 포인터 (0) | 2022.03.11 |
---|---|
[C언어:초급-011] 문자열 (0) | 2022.03.09 |
[C언어:초급-009] 배열 (0) | 2022.03.07 |
[C언어:초급-008] 상수 (0) | 2022.03.06 |
[C언어:초급-007] 연산자2-비교, 논리 (0) | 2022.03.06 |