* 아래의 내용은 다음 유튜브 강의의 필기임. (이 강의 및 앞의 3강의)
https://www.youtube.com/watch?v=IzoFn3dfsPA
1. Variables
primitive data types
- char, short(2 byte), int, long(4 byte, varies depending on compiler), long long(8 byte)
- float: 4 byte
- double: 8 byte
그냥 float a = 5.5 이렇게 저장하고 그 부분에 커서 올리면 double이라고 뜸..
float a = 5.5f 이렇게하면 진짜 float으로 저장됨
- bool 이 존재함 (1 byte, 메모리에 저장해야 하니까 byte 단위로 저장하게 됨)
* sizeof() 사용하면 변수의 사이즈를 알아낼 수 있음
2. Functions
- input(parameters), output(return value)이 있다.
- 코드의 중복을 제거할 수 있다.
- 함수를 사용할 때는, stack에 계속 데이터를 푸시해줘야 하고, 메모리들 사이를 왔다갔다 해야 함. -> 적당히 사용해!
3. Pointers
- an integer/number that saves memory address.
- type이 딱히 의미가 있지 않다. 그 주소에 저장된 데이터가 어떤 type인지 가정할 수 있게 해주는 것 뿐.
- nullptr 로 저장할 수 있음
void * ptr = nullptr;
int var = 8;
ptr = &var;
ptr 위에다가 커서를 두면 0x 어찌구 하면서 주소값이 들어간다는 것을 확인할 수 있다. 이 주소값을 복사한 후,
위에 DEBUG > WINDOWS > Memory 를 누르면 메모리 상태들 볼 수 있음. 이제 복사한 메모리를 검색창에 넣고 검색하면 그 위치에 8이 저장되어 있는 것을 확인할 수 있을 것이다!
void *를 int*로 바꾸어도 메모리를 살펴봤을 때 값이 바뀌지 않는다는 것을 확인할 수 있다. 즉, 포인터의 type은 별 의미가 없다는 것이다.
그냥 변수 선언을 통해 메모리를 이용하면, stack에 데이터가 저장된다. 그럼 데이터를 heap에 저장하는 것은?
* memset, delete
char * buffer = new char[8]; // 8 bytes of memory를 요청, 그리고 이에 해당하는 주소값 반환
memset(buffer, 0, 8); //buffer이 가리키는 공간에 0으로 8바이트를 채워라
delete[] buffer; // 공간 삭제, 데이터 지움
4. References
컴퓨터가 처리할 때 사실 reference와 pointer는 거의 비슷하다. 그러나 사용자가 사용할 때 그 양상이 좀 다르다.
참조한다는 것은, 이미 존재하는 var을 참고한다는 뜻으로 이해하면 된다. 딱히 메모리를 차지하는 것이 아니다. 포인터는 메모리 공간에 부여되고 그러지만...
int var = 1;
int* ptr = &var; //pointer
int& ref = a; // reference
ref = 2;
cout << a << endl; // 2가 프린트 됨.
ref는 실제로 메모리에 저장되는 변수가 아니다. 코드를 컴파일 하면 var변수는 존재하지만 ref라는 것은 저장된 바가 없을 것이다.
실제로 코드에서 사용되는 예시를 보자면,
void Decrement(int *v){
(*v)++;
}
int main(){
int var = 5;
Decrement(&var);
}
이렇게 주소값을 넘김으로서, var에 저장된 변수에 접근해서 그 변수를 변경할 수 있다. (포인터 사용)
또 다르게 참조하는 방식은 아래와 같다. (reference를 사용하는 것, 좀더 syntax가 clean해짐)
void Decrement(int& v){
v++;
}
int main(){
int var = 5;
Decrement(var);
}
우선 포인터가 사용하기에 더 강력하다 정도로 이해하면 될 것 같다.
또 하나 reference방식이 pointer와 다른 점은, reference를 바꿀 수 없다는 것이다. 예를 들어서
int main(){
int a = 5;
int b = 6;
int& ref = a;
ref = b; // ref가 가라키는 곳이 b로 바뀔 것 같지만, a의 값이 6으로 바뀔 뿐이다.
}
a를 참조하는 참조변수 ref는 a값을 참조할 것이다. 그럼 ref가 가리키는 것을 b의 값을 바꾸고 싶다? -> 불가능!
ref = b; 이런식으로 그냥 저장해버리면 ref가 참조하는 a의 값에 b의 값이 들어갈 뿐이다. 포인터였다면 ref가 b의 값을 가리킬 수 있게 b의 주소값을 저장해줄 수 있지만 ref는 불가능하다.
'언어 > C&C++ 기본' 카테고리의 다른 글
[C++] Class (0) | 2021.06.25 |
---|---|
[C++] Header Files (0) | 2021.06.14 |
[C++] Linker (0) | 2021.06.14 |
[C++] Compiler (0) | 2021.06.14 |
[C++] How C++ Works (0) | 2021.06.14 |