C

포인터를 해보자 - 고등학생이 알려주는 C언어

OHDONGHYEON 2022. 5. 3. 20:42

C언어를 사용하는 이유 pointer(포인터)*

나, 오동현은 C언어의 포인터의 기본적이고 아주 기본적인 예제와 설명들을 이 문서에 기록해두었다.


먼저, 이렇게 C언어에서 이렇게 주소를 다룰 수 있을지 고민을 해보았는가?

    int t=3;
    int b;
    &b = &t;


한번 우리 모두 실행을 해보고 아래의 글을 읽어보자!



기본적으로 C에서 포인터는 아래와 같다.

int *a;

이렇게 * 연산자만 사용해주면 포인터가 사용이 가능하다.
포인터 연산자를 사용하면 a라는 별칭의 변수에 어떠한 주소를 저장할 수 있다.



그러면 과연 a라는 별칭의 (주소를 저장하는)포인터 변수에 어떻게 b의 주소를 저장 할 수 있을까?
아래의 두가지 방법이 있다.
이 두가지 방법을 무조건 숙지해야한다.
그래야 포인터를 사용 할 수 있다.

int b;
int *a = &b;


,

int b;
int *a;
a = &b;

이렇게 위와 같이 a라는 별칭의 변수에 b의 주소값을 저장 할 수 있다.



그러면 int *a를 통해 선언 후, a에 저장된 b의 주소값을 출력하는 방법은 무엇일까?
만약 a에 &를 붙여준다고 생각했다면 엄청난 오해이다. (&a는 b의 주소를 저장하는 포인터 변수인 a 공간의 주소이다)
왜냐하면 우리는 *를 사용해 포인터 변수를 선언했기 때문에
a자체가 b의 주소값을 가진다.

int b = 3;
int *a = &b;
printf("%p", a); //a는 바로 a가 가지고 있는 주소값을 의미한다

그러면 이제 a가 가지고 있는 주소에 있는 값을 어떻게 출력할 수 있을까?

int b=3;
int *a = &b;
b=4
printf("%d", *a);

위와같이 다시 a에 *를 붙여주면 역참조(a가 가지고있는 주소의 값 가져오기)를 할 수 있는것이다.
출력은 "4"가 될 것이다.


정말 당신이 포인터 연산자 *하나를 쓰기 위해서 이 과정을 거쳐야할것으로 보인다...
앞으로 배열포인터 아니면 포인터함수, 이중 삼중 포인터를 써야할텐데.... ㅎㅎ
이걸 이해 한다면 이제 1차 포인터 수업을 끝내주도록하겠습니다.

    int b = 3;
    int *t = &b;
    printf("%p ", t);
    printf("%p ", &t);
    printf("%d", *t);
 
t는 &b이다.
&t는 t의 주소값이다.
*t는 b의 값인 3이다.
 
int b=3;
int *t = &b;
printf("%p ", t);
printf("%p ", *(&t));

첫번째와 2번째의 출력은 &b의 값으로, 똑같다.

    int b=3;
    int *t = &b;
    printf("%d ", *(*(&t)));

이 출력값은 3이 나오게된다.