본문 바로가기
C/[코드조선] C 핵심

[C] 포인터

by 묻공러 2024. 2. 8.

참조 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()  (1) 2024.02.09
[C] strlen()  (0) 2024.02.09
[C] 재귀 함수 (Resurcive Function)  (1) 2024.02.07
[C] 변수의 종류  (0) 2024.02.07
[C] 스코프와 스택프레임  (0) 2024.02.06