본문 바로가기
c언어

c언어 간접 참조 연산자 알아보기(*, &)

by 개발자 L 2022. 12. 7.
반응형

c언어 간접 참조 연산자 알아보기(*, &)

네 안녕하세요, 이번 포스팅에서는 c언어에서 쓰는 간접 참조 연산자에 대하여 알아보는 시간을 가져보도록 하겠습니다.

간접 참조 연산자는 포인터를 통하여 값을 읽어오거나 변경할 수 있어서 편리하다는 장점을 가지고 있습니다.

그럼 지금부터 이 간접 참조 연산자에 대하여 알아보도록 하겠습니다.

 

1. 간접 참조 연산자의 해석

간접 참조 연산자는 이러한 기능을 가지고 있습니다.

예를 들어서 *a라는 변수가 있다고 가정을 해봅시다.

이 경우에는 a가 가리키고 있는 위치에 있는 데이터를 가져오라는 뜻이 됩니다.

그리고 단순히 이 포인터만 봤을 때는 여기에 어떤 값이 존재하고 있을지는 아무도 모릅니다.

그래서 형식 지정자를 붙여주는겁니다.

예를 들어서 정수형 포인터라면 정수형 자료형의 크기에 해당하는 4바이트 크기의 데이터를 끌어올 것이고, float형이나 double형 등의 실수형 자료형이라면 8바이트의 자료형을 끌어다가 올 것입니다.

그리고 이게 곧 포인터가 필요한 이유인데, 포인터가 있어야지 우리가 데이터를 읽어 들일 때 얼마나 많은 양의 바이트 수를 소비하였는지 알 수 있기 때문입니다.

 

2. 절대 주소 사용방법

그리고 절대 주소를 쓰는 방법도 존재합니다.

int *a = (int *)100;
float b = (float *)200;
double c = (double *)300;
char d = (char *)400;

이런 식으로 쓸 수 있는데, 위에 있는 int형을 예로 들어 설명을 하자면, 자료형이 int형인 자료의 100번지 주소부터 4바이트씩 읽어오겠다는 뜻이 됩니다.

그 이유는 정수형 자료형으로 캐스팅을 했기 때문이죠.

나머지 자료형들도 각각의 자료형이 가지는 크기를 끌어다가 오는데, 뒤에 적힌 숫자 번지부터 가져오겠다는 의미가 됩니다.

이러한 방법은 아두이노나 라즈베리 파이 등 하드웨어를 개발하는 개발자들이 쓰는 방법입니다.

단순 웹이나 앱 등 소프트웨어만을 개발하는 개발자들은 저렇게 쓸 수 없습니다.

그 이유는 일반적인 소프트웨어는 운영체제가 데이터를 관리하기 때문에 이 주소에 접근 자체가 불가능하기 때문입니다.

반응형

 

3. & 연산자와 * 연산자

이 두 개의 연산자는 이러한 차이를 가지고 있습니다.

  • & 연산자 : 변수의 주소를 구하여 포인터에 대입한다.
  • * 연산자 : 포인터로 간접 참조를 할 때 사용한다.

이러한 차이를 가지고 있어서 & 연산자는 변수의 주소, 다시 말하면 인덱스 값을 구해다가 해당 인덱스 넘버에 있는 값을 복사하여 표현을 하는 것이고,

* 연산자는 간접적으로 변수의 값을 참조하여 *이 있는 곳으로 길을 만들어 가져온다 생각하시면 이해가 되실 겁니다.

그러면 간단한 예제들을 예로 들어서 한 번 이야기를 해보도록 하겠습니다.

 

3 - 1. 변수의 값과 포인터가 가리키는 값 출력하여 비교하기

제일 먼저 가장 기본적인 것을 해보겠습니다.

변수와 포인터를 연결을 해서 변수의 주소 포인터 값을 출력해볼 것입니다.

그리고 그 후에 변수의 값과 포인터가 가리키는 값을 한 번 비교하여 봅시다.

그럼 바로 코드를 작성해보도록 하겠습니다.

#include <stdio.h>

int main()
{
    int a = 100;
    int *p = NULL;

    p = &a;

    printf("p = %u\n", p);
    printf("&a = %u\n", &a);

    printf("a = %d\n", a);
    printf("*p = %d\n", *p);

    return 0;
}

이렇게 작성을 해봤습니다.

그럼 결과를 바로 보도록 하겠습니다.

p = 6422296
&a = 6422296
a = 100
*p = 100

여기서 보시면 아실 수 있듯이, p는 a의 주소 값을 받았기 때문에 a의 주소 값이 나왔고,

*p는 변수 a의 값을 간접 참조를 했기 때문에 a의 값과 일치하는 것을 볼 수가 있습니다.

이게 바로 & 연산자와 * 연산자의 차이입니다.

 

3 - 2. 포인터의 값 변경하기

이번에는 다른 변수의 주소를 포인터에 저장을 해서 포인터의 값을 변경해보도록 하겠습니다.

바로 코드를 작성해보겠습니다.

#include <stdio.h>

int main()
{
    int a = 1, b = 2;
    int *p;

    p =&a;

    printf("p = %d\n", p);
    printf("*p = %d\n\n", *p);

    p = &b;
    printf("p = %d\n", p);
    printf("*p = %d\n", *p);
    
    return 0;
}

이렇게 작성을 했습니다.

밑에 b의 값을 받았을 때 주소가 어떻게 변하는지 한 번 봅시다.

p = 6422296
*p = 1

p = 6422292
*p = 2

이렇게 다른 값이 나오는 것을 볼 수가 있습니다.

 

3 - 3. 포인터가 가리키는 변수의 값 변경하기

이번에는 이전 예제와는 다르게 포인터가 가리키는 값을 변경해보도록 하겠습니다.

이러한 기능도 있으니 알아두면 좋습니다.

바로 코드를 작성해보도록 하겠습니다.

#include <stdio.h>

int main()
{
    int a = 1;
    int *p;

    p = &a;
    printf("a = %d\n", a);

    *p = 2;
    printf("a = %d\n", a);

    return 0;
}

이렇게 한 번 써봤습니다.

이제 결과가 어떻게 나오는지 한 번 보도록 하겠습니다.

a = 1
a = 2

포인터가 가리키는 값을 바꿔주니까 a의 값도 바뀌어서 출력이 되는 것을 확인할 수 있습니다.

 

여기까지 간접 참조 연산자에 대하여 알아보았습니다.

다음 포스팅에서는 포인터를 사용할 때 주의해야 하는 점에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글