그 놀라운 이야기들...

살아 숨쉬는 코드들을 만들어 봅니다. 조심하세요. 날아갈 수도 있으니...

삶이 어떻게 더... 완벽해~

프로그래밍 언어/C

[C언어:초급-010] 포인터 기초

신코더 2022. 3. 9. 00:10
반응형

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의 포인트 값(주소)을 포인터인 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; // 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