TIL C언어 포인터

Park Choong Ho·2021년 4월 20일
0

TIL(Today I Learned)

목록 보기
1/2

C언어

오늘 공부한 내용은 포인터다. CSAPP을 공부하는데 기초적인 C가 약하니 주요 부분에서 계속 막힌다는 느낌을 지울 수가 없었다. 그래서 C공부를 하기로 결심했는데 또, 무작정 C만 붙들고 있기에는 시간이 한정적이다. 그래서 효율적으로 공부할 레퍼런스를 찾다가 훌륭한 블로그를 찾게되었고 여기서 공부한 내용들을 주기적으로 업데이트 해보도록 하겠다.(나중에 C++까지 공부하면 정말 괜찮을듯)

따라서 앞으로 정리하는 내용은 저 해당 블로그를 공부하고 내가 정리한 것들이다.

포인터

CSAPP을 공부하다보면 이런 코드들을 정말 많이 만난다.

int parseline(char **argv)

비전공자인 나는 이런거를 볼때마다 멘붕이 왔고...(모르는 것이 나왔을때 바로바로 찾지 않은 내 잘못이 더 크다) 대충 포인터가 주소를 가르킨다는 것은 알았는데 또 그 주소를 가리키는 포인터는 먼지... 이번 기회에 제대로 포인터에 대해 짚고 넘어가기로 했다.

우선 포인터는 주소를 가리키는 변수가 맞다. 가령,

int *a;

라는 변수를 선언했다면 a라는 변수는 int 변수의 주소를 가리키는 포인터인 것이다. c언어를 공부한 사람이라면 이정도는 다 알텐데, 이 정도가지고는 충분하지 않다.

우선 포인터가 어떻게 찍히는지를 한번 확인해보자.

#include <stdio.h>

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

    printf("포인터 p에 들어있는 값: %p \n", p);
    printf("int 변수 a가 저장된 주소: %p \n", &a);

    return 0;
}

위 코드를 컴파일하고 돌리면

포인터 p에 들어있는 값: 0x7ffee648535c
int 변수 a가 저장된 주소: 0x7ffee648535c

이와 같은 결과가 나온다. 64bit 컴퓨터 기준으로 (32bit 컴퓨터 기준인 경우 다르다.) 주소값은 총 8바이트가 되는데, 위 주소 값은 총 6바이트만 나타내는데, 사실 이건 별거 없고 앞에 0 4개가 생략되어 있을 뿐이다. 사실 0x7ffee648535c0x00007ffee648535c인 것이다. 이렇게 포인터가 주소를 나타내는 값임을 알 수 있는데, 한가지 의문 사항이 생겼다. 포인터는 결국 주소를 나타내는 것이고 시스템마다 주소값의 크기가 결정되어 있을텐데, 왜 포인터 앞에 int *a이런 식으로 어떤 값을 가리키는지 나타내는거지?

*는 선언문에서 쓰이면 포인터 변수를 나타내지만 그외에는 해당 포인터 변수가 가지고 있는 주소에 담겨있는 데이터를 의미한다.

int a = 10;
int *p = &a;
*p = 9;

2번째 줄과 3번째 줄의 *은 다른 의미를 갖는다. 그럼 원래대로 돌아가서, 만일 포인터 변수가 어떤 타입의 변수를 가리키지 않는다고 해보자. 임의의 pointer라는 변수가 있다고 가정해 보겠다.

int a = 10;
pointer p = &a;
*p = 9;

여기서 명심할 것은 사실 포인터는 해당 변수의 시작주소만을 알고 있다는 것이다. 여기서 *p라는 코드로 포인터안에 들어있는 주소 값을 찾아간다고 해도 우리는 얼마만큼 바이트를 읽어들여야할지(char는 1바이트, int는 4바이트 등등) 알 수 없다. 따라서 해당 포인터 변수가 어떤 타입의 변수를 가리키는지에 대한 정보가 있어야 포인터를 통해 데이터에 접근 가능하다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글