포인터(pointer)란
메모리의 주소값을 저장하기 위한 변수로, 포인터 변수라고도 부릅니다.
포인터에 사용되는 연산자
참조 연산자(*) : 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환합니다.
주소 연산자(&) : 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환합니다.
포인터 선언
e.g.) 정수 5이 저장된 int형 변수 num를 선언하면 메모리 주소 0x13번지에 저장된다고 가정한다.
num변수의 메모리 주소 0x13은 정수이며 이것도 저장 가능한 값으로 이것을 포인터 변수라 한다. 이 포인터 변수에 변수 num의 주소 값을 저장한다.
int num = 5; | 정수 5가 저장된 int형 변수 num 선언 |
int * ptr; | 변수 주소 값 저장을 위한 포인터 변수 ptr 선언 |
ptr = # | ptr에 변수 num의 주소 값 저장 |
더보기
#include<stdio.h>
int main(void){
int num = 5;
int * ptr;
ptr = #
}
* 포인터 선언 시 변수의 자료형이 맞지 않으면 컴파일 에러는 발생하지 않으나 경고 메시지는 발생함.
코드 | #include<stdio.h> int main(void){ int num = 88; int * ptr; ptr = # } |
#include<stdio.h> int main(void){ int num = 88; double * ptr; ptr = # } |
- | 경고 메시지 발생 |
잘못된 포인터 사용
코드 1 | #include<stdio.h> int main(void){ int * ptr; * ptr = 122; } |
포인터 변수 선헌만하고 초기화하지 않으면, 포인터 변수는 쓰레기 값으로 초기화. 어디를 가르킬지 모르게 되는데, 이러한 상태에서 * 연산을 통해 122을 저장한다는 것은 치명적인 결과로이루어짐. |
코드 2 | #include<stdio.h> int main(void){ int * ptr = 88; *ptr = 122; } |
ptr을 88로 저장하였으나, 위치를 모르는 88번지는 더미 값으로 변수를 초기화한 것과 같음. |
코드 3 | #include<stdio.h> int main(void){ int * ptr1 = 0; int * ptr2 = NULL; } |
ptr1을 초기화하는 값 0을 가리켜 '널 포인터'라 하며 이는 0번지를 의미하는 것은 "아무곳도 가르키지 않는다"이다. ptr을 초기화하는 값 NULL은 널 포인터를 의미한다. |
포인터 변수 값의 변화
#include<stdio.h>
int main(void){
int num_A = 100, num_B = 200;
int *ptr;
ptr = &num_A; //num_A로 포인터 변수 초기화
*ptr += 50; //num_A+=50과 동일
ptr = &num_B; //num_B로 포인터 변수 초기화
*ptr -= 100; //num_B-=100과 동일
printf("num_A:%d num_B:%d\n", num_A, num_B);
}
// 결과 >> num_A:150 num_B:100
'Coding > C' 카테고리의 다른 글
배열(array) (0) | 2021.07.24 |
---|---|
함수·재귀함수, 지역·전역변수 (0) | 2021.06.26 |
성적 계산기(if ~ else, switch) (2) | 2021.06.13 |
구구단 출력하기 (while, for) (0) | 2021.06.12 |
반복문 제어(continue, break, goto) (0) | 2021.06.12 |