티스토리 뷰

SW/C

C_5. 포인터

김아진 2020. 1. 4. 23:39

5. 포인터

1. 포인터

자료의 주소를 저장하는 변수. (값 참조)

 

형태: 자료형 *변수이름;

* : 포인터 변수를 선언하는 포인터 연산자 

& : 변수의 주소 알려주는 주소연산자 

 

ex)

int *pointer;
int num = 1;
pointer = # // pointer 변수에 현재 num의 주소값 저장

포인터 변수에 값을 할당하고 싶으면 넣고 싶은 주소를 변수에서 주소연산자, &을 이용해 뽑는다. 

& 연산자를 피연산자의 주소로 반환한다. 

 

  1. & 연산자의 피연산자는 반드시 변수이어야만 한다. 

  2. 포인터 변수와 형(int, float, ...)과 주소값에 저장될 변수의 자료형은 반드시 일치해야 한다. 

  3. 포인터 변수를 선언하고 당장 사용하지 않으면 NULL 값을 채워넣는 것을 권장한다. - 널포인터

  4. 보통변수는 값을 읽거나 쓰는 것을 변수의 유효 범위(scope) 내에서만 가능하지만, 주소를 쓰면 변수의 유효 범위(scope) 밖에서도 변수 변경이 가능하다. 

ex)

int *pointer;
int num = 1;
pointer = #
*pointer = 2;

포인터 변수 앞에 *연산자를 사용하면 이는 포인터 변수가 담고 있는 변수의 값에 접근하는 것이다. 

 

ex)

void swap(int a, int b)
{
    int temp = *a; // 여기서 *는 변수값에 접근하기 위해 사용됐다. 
    *a = *b;
    *b = temp;
}

*는 2가지 의미로 사용하는데, 첫번째는 포인터 선언할 때, 두번쨰는 변수 값에 접근할 때 사용한다. 

포인터 변수 선언 후, 포인터 변수인지 일반 변수인지 알 수 없다. (구분을 위해 관례상 변수 앞에 p_를 붙이는 편이다.)

 

 

2. 더블포인터

 

ex)

#include <stdio.h>

void swap(int **a, int **b)
{
    int *temp = *a;
    *a = *b;
    *b = temp;
}

void main()
{
    int num1 = 10;
    int num2 = 20;
    int *p1 = &num1;
    int *p2 = &num2;
    
    swap(&p1, &p2);
    printf("%d %d", *p1, *p2);
    return(0);
}

p1, p2의 값에 num1, num2의 주소가 들어가고, swap되서 p1와 p2의 주소가 서로 바뀐 것. 

주의: num의 주소 안의 값이 바꾼 것이 아니라, num의 주소를 가리키는 방향을 바꾼 것이다! 

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

C_7. DFS & BFS  (0) 2020.01.05
C_6. 재귀함수  (0) 2020.01.05
C_4. 오버플로우 & 언더플로우  (0) 2020.01.04
C_3. 정적 메모리 할당 & 동적 메모리 할당  (0) 2020.01.04
C_2. 정적 라이브러리 & 동적 라이브러리  (0) 2020.01.04
댓글