본문 바로가기
  • 부자가 될 남자
프로그래밍/C

[C언어] 포인터 - 정의, 연산자, 선언, 상호관계성

by ㅍ우주 2023. 5. 16.

포인터란?

c언어에서 포인터란 주소값을 저장하는 변수이며, '포인터 변수' 라고도 부릅니다.

char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.

 

 

int n = 10;
int *ptr = &n;
printf("%d, %d", ptr, *ptr);

 

위의 코드에서, *prt = &n이라고 하여 마치 *ptr이라는 변수에 n의 주소값이 들어간 것처럼 보이나, 결과를 보면 알 수 있다시피,

[*포인터_변수명 = 주소값]과 같이 포인터 변수를 초기화하더라도 포인터_변수명에는 특정 주소값이 들어가는 것이고,

*포인터_변수명에는 특정 주소값내의 특정 값이 들어감을 알 수 있다.


포인터 연산자

C언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같습니다.

1. 주소 연산자 (&)

2. 참조 연산자 (*)


    1. 주소 연산자(&)

      주소 연산자(&)는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환합니다.

      

    2. 참조 연산자(*)

        참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환합니다.

 

 

*&는 아무것도 없는 것과 같다. &는 주소이며, *은 그 주소의 값이기 때문에, *&은 서로 상쇄된다.

고1 수학 (하)에서 배운 함수와 역함수를 떠올리면 이해가 쉬울 것 같다.

함수 y=f(x)에서, &는 특정 y값에 따른 x값을 나타내는 것, *은 특정 x값에 따른 y값을 나타내는 것으로 생각한다면,

y -> x -> y와 같이 순서도를 작성할 수 있고, 이는 곧 상쇄되는 것으로 생각할 수 있다. 말이 어렵다면 그냥 넘어가도 된다.


 

포인터의 선언

타입* 포인터이름; //포인터의 선언
타입* 포인터이름 = &변수명 //포인터 초기화. (포인터 변수에 주소저장)

 


포인터 변수는 저장된 그 값과 상호관계이다

예를 들어 이해를 쉽게 하겠다.

 

#include <stdio.h>

int main(void) {
    int sg = 408;
    int *wj = &sg;
    *wj = 1121;
    printf("%d", sg);
}

 

다음과 같은 코드가 있을 때, wj = &sg, *wj=sg라는 것을 알 수 있을 것이다.

그런데 이때, 나는 *wj라는 포인터 변수를 수정했음에도 불구하고

*wj와 연결이 되어있는 sg에 영향이 미친다는 걸 결과를 통해 확인할 수 있다.

이를 통해, 포인터 변수는 저장된 그 값과 상호관계라고 볼 수 있으며, 위의 코드에서는 *wj는 sg와 상호관계라고 볼 수 있다.