참조 vs. 역참조
참조: 포인터를 의미하며, 변수의 값을 직접 다 들고 있는 게 아니라, 메모리 주소를 읽는 것
역참조: 변수의 값을 직접 읽는 것이 아니라, 메모리 주소를 통해 타고 가서 값을 읽는 것
// 직접 접근
int score = 100;
score = 50;
// 간접 접근
int score = 100;
int* ptr_to_score = &score; // 포인터를 통해 참조
*ptr_to_score = 50; // 역 참조 연산자(*)를 통해 역참조
NULL 포인터
NULL 포인터는 아래와 같은 경우에 사용한다
1. 포인터의 초기화
2. 포인터가 더이상 사용 중이지 않음을 알리고 싶을 때
ptr = NULL;
3. 포인터가 유효한 메모리 주소를 참조하고 있는지 확인할 때
if (NULL == ptr)
{
/* alert */
}
void 포인터 주의점
1. void*에 역참조 연산을 가할 때,
해당 메모리 주소부터 몇 바이트를 읽어야 값이 나오는지 모른다
2. void*에 정수 산술 연산을 가할 때,
해당 메모리 주소부터 몇 바이트 이동해야 할지 모른다
배열과 sizeof()
배열 이름은 배열의 시작 주소이며
sizeof()를 사용하면 배열의 총크기를 구할 수 있다
여기서 총 크기는 바이트 기준으로 구해지기 때문에
배열의 자료형에 따른 크기는 추가적인 연산을 통해 구해야 한다
//sizeof(배열 이름) = 배열 개수 * 배열 자료형 크기
int arr[10] = { 0, };
int size = sizeof(arr);// 10 * 4 = 40의 결과가 나오게된다
int arrSize = sizeof(arr)/4;// 이렇게 하면 배열 개수가 나오게된다
포인터와 배열
sizeof()를 사용하면 배열과 포인터(배열의 시작주소)의 차이를 극명하게 구분할 수 있다
int main(void)
{
int arr[3] = { 1, 2, 3 };
int* ptr = arr;
int sizeof_arr = sizeof(arr);// 3 * 4
int sizeof_ptr = sizeof(ptr);// 3
}
문자열의 두 가지 방법
// 첫번째 방법
char ch1[] = "ff";
// 두번째 방법
//char* ch2 = "ff";// 비추천
const char* ch2 = "ff";
두 번째 방법에서 const 키워드를 붙여주는 이유는
문자열 리터럴은 읽기 전용 메모리에 저장되기 때문에
해당 문자열을 수정하려는 시도는 undefined behaviour을 유발할 수 있다
따라서, const 키워드를 붙여 문자열을 수정하려고 하면 컴파일러에서 경고가 발생시킬 수 있다
댕글링 포인터(Dangling Pointer)
더 이상 접근 할 수 없는 메모리 주소를 저장하고 있는 포인터를 의미한다
함수 포인터(Pointer to function)
함수 포인터는 함수의 시작 명령어 주소를 담고 있는 포인터를 의미한다
콜백 함수(Call-Back Function)
특정 이벤트가 발생했을 때 자동으로 호출되게끔 등록해 두는 함수를 콜백 함수라고 한다
이중 포인터(Double pointer)
포인터의 메모리 주소를 저장하기 위한 포인터 변수를 의미한다
'C > [코드조선] C 핵심' 카테고리의 다른 글
[C] strcmp() (0) | 2024.02.09 |
---|---|
[C] strlen() (0) | 2024.02.09 |
[C] 재귀 함수 (Resurcive Function) (0) | 2024.02.07 |
[C] 변수의 종류 (0) | 2024.02.07 |
[C] 스코프와 스택프레임 (0) | 2024.02.06 |