본문 바로가기

프로그래밍/C

[C]포인터의 이해와 활용-1

들어가며

자, 블로그를 시작하고 거의 처음 쓰는 글이다.

많이 미숙하고 오류가 있는 부분들도 있을 수도 있고

그날 점심으로 스파게티를 거하게 먹었음을 추리할 수도 있다.

하지만 참고 양해 바란다. 어차피 나 혼자 보는 일기장이기 때문이다.

각설하고, 방학을 의미있게 보내기 위해 C언어의 꽃, 포인터를 학습하려고 한다!

 

&(참조 연산자, 주소 연산자)

변수의 메모리 주소를 구할 때는 변수의 이름 앞에 '&'를 사용한다.

int main()
{
    int num = 0;
    printf("%p \n", &num);  //이때 저 &num은 num이 저장된 메모리 공간 상의 주소값을 가리킨다.
                            //다시 한번 말하지만 '가리키는 것'이다.
    return 0;
}

 

*(포인터 연산자)

포인터 변수를 선언할 때는 포인터의 이름 앞에 '*(Asterisk)'를 사용하여 선언한다.

#include <stdio.h>

int main()
{

    int *numptr;     // 포인터 변수 'numptr'을 선언하는 방식이다.
    int num = 10;
    
    numptr = &num;    // 포인터 변수에는 '지정한 변수의 주솟값'을 저장한다.
    
    return 0;
}
​

따라서 아래의 두 코드는 동일한 주솟값을 출력한다.

printf("numptr의 값: %p", numptr);    //numptr에는 num의 주솟값이 '저장되어 있다'.
printf("&num의 값: %p", &num);        //&num은 num의 주솟값을 '가리킨다'.​

 

*(역참조 연산자)

역참조 연산자를 사용할 때는 포인터(포인터 변수) 앞에 '*'를 사용한다.

#include <stdio.h>

int main()
{
    int *numptr;                 // 포인터 변수 numptr 선언
    int num = 10;                // 정수형 변수 num을 선언과 동시에 초기화

    numptr = &num;               // 포인터 변수 numptr에 num의 주솟값을 저장

    printf("%d\n", *numptr);     // numptr은 num의 주소가 저장되어 있음
                                 // 역참조(*)를 하여 주소에 접근, num의 값을 가리킴
    return 0;                    // 다시 말하지만 '가리키는 것'이다.
}
​

 

이 역참조를 통하여 본래의 num값을 수정할 수도 있다.

 

강제 자료형 변환

역참조 연산자는 자료형을 강제로 변환시킬 수 있다.

int *numptr;
int num = 10;

numptr = num1;   // numptr은 'int 포인터형'이고 num은 'int형'
                 // 따라서 자료형이 일치하지 않아서 컴파일 오류 발생.
                 
*numptr = num;   // *numptr은 'int형'이고 num도 'int형'이므로 자료형이 일치함.
                 // 역참조(*)를 이용하여 numptr의 자료형을 강제로 변환함.

위 코드 처럼 'int 포인터 형'을 'int'형으로 강제 자료형 변환이 가능하다.

int *numptr;
int num;

numptr = &num1;    // numptr은 'int 포인터형'이고, &num은 'int형 변수의 주소'이므로 자료형이 일치함
                   // numptr은 pointer to int, &num은 address of int이므로 자료형이 일치함
 

<출처> 코딩 도장, Unit 34.2 역참조 연산자 사용하기, 그림34-8


마지막으로 정리하자면 다음과 같다.

<출처> 코딩 도장, Unit 34.2 역참조 연산자 사용하기, 그림34-9


참고 및 출처

  • 코딩 도장