언어/C&C++ 기본

[C++] Variables, Functions, Pointers, References

차가운오미자 2021. 6. 14. 18:37

 

* 아래의 내용은 다음 유튜브 강의의 필기임. (이 강의 및 앞의 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