포인터 사용 예 1
•
포인터는 할당된 메모리에만 접근 가능
#include <stdio.h>
int main(void){
int var = 3;
int *ptr = &var;
printf("var 메모리 주소 = %p ptr 값 = %p\n", &var, ptr);
*ptr += 9; // *ptr = *ptr + 9
printf("var의 값 = %d\n", var);
return 0;
}
C
복사
포인터 사용 예2
•
포인터를 이용하여 한 메모리에 접근 및 읽기, 저장 가능
#include <stdio.h>
int main(void){
int var = 3;
int *ptr1, *ptr2;
ptr1 = &var;
*ptr1 = 7;
printf("var = %d\n", var);
ptr2 = ptr1;
*ptr2 = 12;
printf("var = %d\n", var);
return 0;
}
C
복사
•
포인터를 이용해서 메모리주소에 저장된 값을 바꿀 수 있다.
void형 포인터
•
의미
데이터형이 정해지지 않은 포인터 변수
•
역할
모든 메모리 주소를 저장만 함
→ 접근을 위한 데이터형 변환 필요
*(데이터형*) 포인터명
•
형식
void *ptr;
•
코드
#include <stdio.h>
int main(void){
int var1 = 12;
void *ptr;
ptr = &var1;
printf("%d\n", *(int*)ptr);
return 0;
}
C
복사
포인터와 배열
•
포인터를 이용하여 배열을 다룰 수 있는 이유?
◦
같은 데이터형, 연속적인 메모리 할당
•
포인터 변수 + n 와 *(포인터 변수 + n)의 의미
◦
배열의 인덱스와 같은 뜻을 가지고 있다. ptr + 1 일때 다음 메모리주소를 가르킨다.
◦
int array[3];
int *ptr = array;
ptr + 0, ptr + 1, ptr + 2
*(ptr + 0), *(ptr +1), *(ptr +2)
◦
*(ptr+0) 은 %d 정수 출력만 가능한것 같음
◦
실제로 해보니 ptr + 0 같은 경우에 %p 메모리주소 출력가능
•
배열과 포인터 형식 호환
int array[5] = {1, 2, 3, 4, 5};
int *intptr = array;
intptr[0], intptr[1]
-> *(intptr + 0), *(intptr + 1)
C
복사
NULL 포인터
•
의미
아무것도 참조하지 않는 포인터 변수
•
저장하는 값
0, '\0'(문자상수), NULL(문자열)
•
포인터를 사용하여 할당한 메모리를 해제했을 때