Skip to content

Commit 848e597

Browse files
authored
Merge pull request #77 from fkdl0048/69-task-null과-nullptr-1
Task: null vs nullptr
2 parents f9a1db7 + 7fd91b0 commit 848e597

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

Language/C++/NullVsNullptr/README.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# null vs nullptr
2+
3+
C++에서 사용되는 null과 nullptr의 차이점을 알아보자. *(사용 방법은 대략적으로 알고 있지만 실제 차이점을 명확히 모르는 경우)*
4+
5+
## null
6+
7+
`null`은 기존 C언어에서 사용된 관습적인 **매크로**로, 보통 `#define NULL 0` 또는 `#define NULL ((void*)0)`으로 정의된다. *cstddef 헤더 파일에 정의되어 있으며, `0` 또는 `NULL`로 사용된다.*
8+
9+
배경과 기원이 이러해서 C++에서는 `NULL`이 단순히 정수 `0`으로 취급되며 포인터와 정수 간의 모호함을 유발한다. 예를 들어, `NULL``int``char*` 모두에 대입할 수 있어서 컴파일러가 암묵적으로 형변환을 수행한다.
10+
11+
```cpp
12+
int* p = NULL; // int* p = 0;
13+
char* q = NULL; // char* q = 0; => 컴파일러가 암묵적으로 형변환
14+
```
15+
16+
이러한 코드는 코드 작성자에게 혼란을 줄 수 있다..! *실제 경험* 따라서 C++11에서는 `nullptr`를 도입하여 이러한 문제를 해결하였다.
17+
18+
## nullptr
19+
20+
C++11에서 등장한 `nullptr``nullptr_t` 타입의 리터럴이다. `nullptr``nullptr_t` 타입의 유일한 값이며, `nullptr`는 모든 포인터 타입으로 암묵적으로 변환되지 않는다. 따라서 위에서 말한 혼란을 방지할 수 있다.
21+
22+
```cpp
23+
void foo(int i);
24+
void foo(char* p);
25+
26+
foo(nullptr); // foo(char* p); => nullptr는 모든 포인터 타입으로 암묵적으로 변환되지 않는다.
27+
```
28+
29+
헷갈릴 수 있는 부분인 `nullptr`은 `nullptr_t` 타입의 리터럴이라는 용어로 이는 특별한 리터럴 상수로 nullptr이 메모리의 특정 위치를 차지하지 않으며 컴파일 타임에 처리되는 리터럴 상수라고 이해할 수 있다. nullptr_t가 타입이니 nullptr은 변수이고 전역적으로 사용되니 static인가? -> 이 흐름이 아닌 리터럴 상수라는 점을 기억하자.

Language/C++/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ C++에 관한 내용 정리
2626
- [C++ Const](./Const/README.md)
2727
- [C++ String](./String/README.md)
2828
- [C++ Compiler](./Compiler/README.md)
29-
- [C++ Assembler](./Assembler/README.md)
29+
- [C++ Assembler](./Assembler/README.md)
30+
- [null vs nullptr](./NullVsNullptr/README.md)

0 commit comments

Comments
 (0)