Log to grow

[C] 포인터의 기초, 간단 정리 본문

PL/C

[C] 포인터의 기초, 간단 정리

kkkrrr 2020. 9. 8. 20:11

 

 

 

1. 포인터란?

1) 정의 :  변수의 주소값을 담는 변수

- 왜 포인터일까? 변수의 주소값을 담는다는 것은 변수가 위치를 가리키는 것이므로!

 

2) 변수의 주소값?

- 변수는 메모리 공간 어딘가에 저장이 되고 주소가 할당된다. 

- 변수의 주소는 '&' 연산자를 통해 접근한다!

int num = 1;

printf("%d\n", num);    // 1
printf("%#x\n", &num);   // 0xed847898 --> num 변수의 주소값

**  #x 는 0x........ 의 형태로 주소값을 출력하기 위한 용도 (16진수)

 

2. 포인터의 선언

// 자료형 *변수_이름

int *num_pointer

- 변수 이름 앞에 *(asterisk)를  붙임으로써 포인터 변수임을 표시한다!

- 변수 이름 앞에 붙이긴 하지만 자료형과 묶어 하나의 자료형이라고 생각하면 이해가 쉽다.

  - ex) int  *  : 정수형 포인터의 자료형!

 

3. * 의 사용

- 역참조(dereference) 연산자

- 역참조의 말 뜻 그대로 포인터 변수에 담겨있는 주소값에 해당하는 변수를 의미!

    - 쉽게 얘기해서 포인터가 가리키고 있는 변수의 값!

 

int num = 1;
int *num_ptr = #

printf("%#x\n", num_ptr);   // 0xed847898 --> num 변수의 주소값
printf("%#x\n", *num_ptr);   // 1 --> num 변수의 값

 

- 결과적으로, 포인터 변수를 선언할 때의 '*'와 포인터 변수를 사용할 때의 '*'의 의미를 구분하는게 편하다.

int num = 1;

int *num_ptr = #   // -> 'int *'를 하나의 자료형으로 생각
*num_ptr = num;		   // -> 포인터 변수 앞에 *는 역참조!

 

4. 함수의 인자로써의 포인터

int main(){
        int num = 1;
        func(&num);
        return 0;
}

void func(int *num_ptr){
        printf("%d\n", *num_ptr);
}

- 함수의 parameter는 포인터 변수로 선언 (int *num_ptr)

- 전달되는 argument는 parameter의 담길 이므로 변수의 주소값 (&num)

 

- 이해가 어렵다면 아래 예제와 비교해보면 쉽다. parameter는 변수, argument는 값!

int main(){
        func(1);
        return 0;
}

void func(int num){
        printf("%d\n", num);
}

 

 

5. NULL 포인터

- 포인터의 값을 NULL로 지정할 수 있으며 이를 NULL 포인터라고 부른다.

int *num_ptr = NULL;

printf("%#x\n", num_ptr);   // 0 -> NULL 포인터에 담긴 값은 0

 

 

'PL > C' 카테고리의 다른 글

[C] Recursive Problem  (0) 2018.05.17
Comments