C - 포.인.터
업데이트:
포인터
의미
- 주소를 저장하기 위한 변수형
- 변수인데 속에 담긴 내용은 메모리 주소
주소에 저장된 자료형은?
- 그 주소에 어떤 형의 데이터가 있는지 명시하기 위해 포인터 앞에 자료형을 붙임
- 이진수만 나열되어있는게 무슨 자료형인지 알수가 읎어요~
포인터에 저장된 주소도 변경 가능
역 참조 연산자
void update_value(void) {
int score = 100;
int* ptr = &score;
printf(*ptr); // 역참조. 100
*ptr = 50;
printf(*ptr) // 역참조. 50
}
참조?
- 주소를 이용해 간접적으로 접근
- 데이터 복사 없이 원본에 접근 가능
포인터는 참조에 의한 전달 vs 값에 의한 전달?
- 원본이 바뀌니 -> 참조
- 메모리 주소 값을 복사하니 -> 값에 의한 전달
- 원본이 바뀌는지 안 바뀌는지가 중요함.
NULL 포인터
아무것도 가리키지 않는 포인터
- 값이
0
인 정수 상수 표현식, 혹은void*
로 캐스팅된 표현식
언제 사용하나?
- 포인터 변수를 초기화하고 싶을 때
- 아직 참조할 주소가 없을 때
- 포인터 변수가 유효한 주소를 참조하고 있는 지 확인하고 싶을 때
- NullPointerException을 막고 싶을 때
- 댕글링 포인터를 막기 위해
- 더 이상 사용하지 않는 데이터를 가리키는 포인터 변수를
- 널 포인터를 이용해 리셋
존재하지 않는 메모리 주소에서 값을 읽어오려고 하면 문제가 터진다.
포인터의 크기
모든 포인터는 동일한 크기를 가짐
- 32비트 아키텍처는 4바이트, 64비트 아키텍처는 8바이트
배열은 연속된 메모리라 모두 스택에 넣을 수 없음, 매개변수에 시작 위치(메모리 주소)만 전달했음
- 배열과 포인터는 매우 유사함
포인터에 정수 1을 더한다는 건
-
포인터의 위치를 다음 데이터의 위치로 이동한다. 1바이트를 더하는 것이 아니다.
sizeof(자료형)
바이트를 더하는 것 -
nums[1] == ptr[1] == *(ptr + 1)
포인터의 용도
- 큰 데이터를 배개변수로 전달
- 배열이 매개변수로 전달될 경우, 첫 번째 요소의 주소를 전달
- 반환값이 둘 이상일 때
- 포인터를 사용하면 함수 안에서 원본을 변경할 수 있음
- 동적 메모리 할당
- 함수의 범위에 상관없이 사용하고자 하는 데이터가 다음과 같은 경우에 해당하면 사용
- 데이터의 크기를 컴파일 도중에 알 수 없거나
- 프로그램 실행 수명 보다는 짧은 시간 동안만 사용하려고 할 떄
- 동적으로 할당된 메모리는 연속된 메모리 덩어리 -> 포인터가 적합
- 함수의 범위에 상관없이 사용하고자 하는 데이터가 다음과 같은 경우에 해당하면 사용
- 그 외
- 자료구조 구현 시 : 연결 리스트, 트리 등..
- 임베디드 프로그래밍 등에서 하드웨어에 있는 메모리에 직접 접근해야 할 때
참고
POCU 강의 “C 언매니지드 프로그래밍”
댓글남기기