Pointer
주소값을 가지는 변수입니다.
주소값이란
모든 변수는 주소값을 가지며, & 를 사용하여 조회할 수 있습니다.
다음 소스는 p 의 변수 값과, p 가 할당된 메모리 주소를 조회합니다.
#include <stdio.h> main() { int p = 0; printf("p value = %d, p memory address %p\n", p, &p); return 0; }
p value = 0, p memory address 0x7ffc317fdcdc
위의 소스를 수행할 때 memory 상의 0x7ffc317fdcdc 주소에 0 이 저장되어 있습니다.
포인터를 선언하는 방법
변수명 앞에 * 를 사용하여 포인터 변수를 선언합니다.
Valuetype *valuename;
int 형 포인트 변수 p 를 선언하였습니다. 이후에 포인터 변수 p 에 3을 대입하였습니다.
실행이될까요? 실행되지 않습니다.
#include <stdio.h> main() { int *p; *p = 3; printf("p memory address %p\n", p); printf("p value = %d\n", *p); return 0; }
이유는 포인터 변수 p 를 선언만 하고 초기화해주지 않아 주소가 쓰레기 값으로 되며, 포인터 변수가 어디를 가르킬지 알 수 없기 때문입니다.
따라서 위의 코드는 매우 치명적이며, 절대로 이렇게 사용해서는 안됩니다.
그렇다면 포인터 변수 p 는 어떻게 초기화 해야할까요? = 0 혹은 = NULL 로 초기화를 할 수 있습니다.
아래 소스는 p, q 포인터 변수는 아무것도 가르키지 않는다는 의미입니다.
#include <stdio.h> main() { int *p = 0; int *q = NULL; return 0; }
포인터 사용 예제
1. int 형 x 를 선언한 뒤 0 의 값을 대입해 줍니다.
2. point 형 변수 p 에 x 의 주소값을 대입합니다.
x 와 p 는 동일한 주소를 가르키며, 주소가 동일하기 때문에 하나의 변수 값만 바꿔도 둘 다 변경됩니다.
#include <stdio.h> main() { int x = 0; int *p = &x; printf("x memory address %p\n", &x); printf("p memory address %p\n", p); printf("x value = %d, p value = %d\n", x, *p); x = 1; printf("x memory address %p\n", &x); printf("p memory address %p\n", p); printf("x value = %d, p value = %d\n", x, *p); return 0; }
x memory address 0x7ffdce9a6494 p memory address 0x7ffdce9a6494 x value = 0, p value = 0 x memory address 0x7ffdce9a6494 p memory address 0x7ffdce9a6494 x value = 1, p value = 1
정리를 해봅니다.
일반변수와 포인터 변수의, 메모리 주소를 가져오고 싶은 경우 아래와 같은 방법으로 사용합니다.
포인터 변수는 포인터 변수명으로
일반 변수는 &일반 변수명으로
일반변수와 포인터 변수의, 값을 가져오고 싶은 경우 아래와 같은 방법으로 사용합니다.
포인터 변수는 *포인터 변수명으로
일반 변수는 일반 변수명으로
포인터 변수에 일반 변수를 대입하고 싶은 경우 아래와 같은 방법으로 사용합니다.
포인터 변수 = &일반변수
'Computer Language > C' 카테고리의 다른 글
[C] malloc, free 로 메모리 동적 할당 해제하기 (0) | 2018.06.27 |
---|---|
[C] memcmp 메모리 블록을 비교하는 함수 (0) | 2018.06.27 |
[C] memcpy 문자열을 지정 바이트 범위만큼 복사하는 함수 (0) | 2018.05.01 |
[C] memset 바이트 단위로 값을 지정하는 함수 (0) | 2018.04.27 |
[C] Call By Value 와 Call By Reference 차이점 알아보기 (0) | 2018.02.19 |