본문 바로가기
c언어/기본 개념

포인터

by 감조자림 2022. 12. 3.

내가 이해한 것이 정확한지는 모르겠다. 다만, 아직까지 내가 이해한 바에서 벗어나는 예외는 보지 못했다.

포인터는 int*, char*, double*, void* 등과 같이 쓰일 수 있다. 나는 자료형에 *(포인터)가 붙으면 그것은 하나의 또 다른 자료형이 되는 것이라 이해했다. 예를 들어 평소에 자주쓰는 int, char, double 등과 같은 자료형이 있고, 여기에 int*, char*, double* 이라는 자료형이 별개로 존재한다고 볼 수 있다. 

 

가령 int *p; 라고 선언을 하면 p는 주소를 가리키는 변수값이 된다. 그리고 *p는 'p라는 놈이 가리키는 주소에 있는 값'을 의미하게 된다.

int main(){
int i = 10;
int* p;
p = &i;
printf("%d", *p);
}

위 코드를 출력하면 10이 출력 될 것이다.

 

int compare(void *a,  void *b)
{
    coord A = *(coord *)a; 
    coord B = *(coord *)b;
    if (A.x > B.x) 
        return 1;
    else if (A.x == B.x) 
    {
        if (A.y > B.y)
            return 1;
        else
            return -1; 
    }
    return -1; 
}

위 코드에서 coord는 typedef으로 만든 구조체 자료형이다.

(coord*)라는 자료형인 a 가 가리키는 값을 coord A로 정의한 것이다.

매개변수 자리에 void* a라고 되어있듯이 a는 주소를 가리키는 변수값이다 따라서, (coord*) a라고 적어줌으로써 a가 가리키는 주소에 있는 녀석이 coord임을 알려준다. 그리고 그 앞에 *를 하나 더 붙여줌으로써 'a가 가리키는 주소에 있는 값'이 된다. 그것이 A이다. 포인터는 이 정도면 충분히 이해한 듯하다.

 

그리고 헷갈리는 것 하나.

      *p++: 'p가 가리키는 값' 을 가져온 후에 'p'를 증가시킨다. (p가 int*형 배열이라면 4 증가한 값이 들어가게 될것)
       (*p)++: 'p가 가리키는 값'을 가져온 후에 '가리키는 값'을 증가시킨다.
       *++p: 'p'를 증가시키고 증가된 'p가 가리키는 값'을 가져온다
       ++*p: 'p가 가리키는 값'을 증가시킨 후에 가져온다

 

다만, 한 가지 의문점이 있다. 컴파일러에서 일반적으로 int* p; 가 아니라 int *p;라고 정렬을 시켜준다. int에 *를 붙이는게 아니라 p에 *을 붙인다. 이 때문에, 내가 이해한 바와 다를 것이라는 생각이 드는데, 아직까지 반례를 발견하진 못했다.

-> 위에 적혀있듯이 내가 이해한 바가 맞는 것 같다. int* p; 라고 하지않고 int *p;라고 하는 것은 한 번에 여러 개의 변수를 선언하는 경우, int* p, a, b; 라고 하면 a, b 는 포인터 변수가 아니라 그냥 int형 변수로 선언이 된다. 이런 경우에 헷갈리기 때문에 자료형에 *를 붙여서 쓰는게 아니라 변수명에 *를 붙여서 쓴다고 한다.

'c언어 > 기본 개념' 카테고리의 다른 글

문자열 상수(char*)에 대한 이해  (0) 2022.12.15
void*  (0) 2022.12.02
const의 의미, 활용법  (0) 2022.11.10
구조체를 가리키는 포인터와 간접 멤버 연산자 ->  (0) 2022.11.10
*과 & 의 차이  (0) 2022.09.24

댓글