[C의포인터_3]

·2022년 7월 6일

C-Study

목록 보기
21/21

#. 220706 (101-107)

101. 포인터로 두 변수의 값 바꾸기

102. 값에 의한 전달 vs 참조에 의한 전달

포인터: 값에 의한 전달? 참조에 의한 전달?

  • 함수를 호출 할 때 언제나 변수(포인터이든 아니든)를 복사함
  • 원본이 바뀌는지 안바뀌는지가 제일 중요한 포인트!

103. 코드보기: Min, Max 한번에 구하기

104. 포인터 함수 반환 값

함수의 지역 변수는 -> 스택에 저장됨.
함수 호출이 끝나면 지역 변수도 사라짐 (유효하지 x)

* 매우 위험한 코드: 포인터가 잘못된 주소를 가리킴 *
int* add(const int op1, const int op2)
{
	int result = op1 + op2; 
    return &result
}
/*메인함수*/
int* result
result = add(10,20)

이 스택 프레임 자체가 더이상 유효하지 않다.(댕글링 포인터)

104. 댕글링 포인터 (위의 유효하지 않은 스택 사진 30)

  • 지역변수가 사용한 '주소' 자체가 사라지는 것은 아님
    • 그 주소를 반환할 때는 컴파일 오류가 나진 않음

✓ 절대 작성해서는 안되는 코드 (댕글링: 달랑거리다)

  • 문제: 포인터가 유효하지 않은 주소를 가리키는 것!
    : 이러한 포인터를 '댕글링 포인터'라고 함

106. 널 포인터

  • 아무것도 가리키지 않는 포인터 (존재하지 않는 주소)
    • 값이 '0'인 정수 상수 표현식
    • 전용 매크로가 있음 (#define NULL ((void*)0)
    • 널 포인터를 표현할 때 이 매크로를 사용할 것
void do_someting()
{
	int number;
    int* num_ptr = &nubmer;
    
    /* 이 포인터 변수는 아무것도(아무 주소도) 가리키지 않는다 */
    num_ptr = NULL;
}

107. NULL이 가지는 문제들

널 포인터를 허용하는 매개변수

  • 함수의 매개변수가 널 포인터를 허용한다면, 매개변수 이름 끝에 '_or_null' 을 붙인다
int get_score(const char* const student_id_or_null)
{
	/* 생략 */
}
profile
Hakuna Matata

0개의 댓글