더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 14.운영 체제와 포인터

더듬이 2021. 8. 30. 14:42
728x90

솔루션, 프로젝트, 코드

비주얼 스튜디오는 솔루션, 솔루션 아래의 프로젝트, 프로젝트 아래의 코드들로 나뉜다.

기본 단위는 프로젝트로 계산한다. 현재 프로젝트의 도움을 주는 다른 프로젝트를 만들수도 있고,

또 다른 프로젝트를 만들 수도 있다.


플랫폼이란?

-프로그램이 실행되는 기반, 안드로이드, IOS, Windows등 다양한 기능들이 세트로 모여있는 공간

-Windows 안에서도 실행 환경을 플랫폼이라고 부른다.

-또한, 개발을 편하게 하기 위해 만들어진 개발플랫폼이라는 것도 존재한다.

⇒플랫폼은 다양한 기능을 제공하여 실행환경을 동일하게 만들어주는 공간을 의미한다.


32비트, 64비트 솔루션 빌드

비주얼 스튜디오는 어떤 운영체제, 즉 32비트 기반의 플랫폼인지, 64비트 기반의 플랫폼인지를 나누어서 빌드가 가능하다

⇒그래서 솔루션 플랫폼이라고 불린다!!

왜 32비트는 x86일까?

⇒32비트 시절 cpu이름이 86이고, 이가 굳어지면서 x86이 32비트를 의미한다.


64비트와 32비트 기반의 플랫폼

32비트와 64비트는 데이터 처리 단위를 이야기한다.

이게 작아지면 메모리 관리 문제가 생긴다.

요즘은 메모리 사용량을 많이 요구하는 게임들이 나오기 떄문에 32비트 기반의 플랫폼에서는

문제가 많이 발생한다. 고성능이지만 그 성능을 제대로 이끄렁 내지 못하기 때문이다.

그래서 요즘은 32비트 기반의 게임을 만들지 않는다.


포인터(포인터 변수)

포인터는 주소값이 저장된,주소를 가리키는 변수이다!

포인터의 선언

int* Pint = nullptr;

자료형 뒤에 *를 붙히는 순간 이 변수는 포인터 변수가 된다.

즉, 이코드는 int형 변수를 가리키는 포인터 변수가 된다.

하지만 가리키는 변수라면, 무엇을 가리키는지 알아야 될 것이다.

그래서 포인터 변수에서는 내가 가리키는 것이 무엇인지 저장해야 한다.

nullptr은 아직 값이 저장되지 않았다는 뜻.

주소란 무엇일까?

주소란 말그대로 변수가 메모리 공간의 어디를 사용하고 있는지를 나타내는 지표이다.

메모리 공간에는 각 바이트마다 주소가 있다, 주스이 단위는 바이트 인 것이다.

int 자료형은 4바이트인데, 그럼 4개의 주소중 어느 쪽이 포인터 변수에 할당될까?

가리키는 변수의 가장 첫 바이트의 주소가 그 변수의 주소가 된다.

왜 포인터 앞에는 자료형을 알려줘야 할까?

의문이 생긴다.

포인터가 그저 주소값을 알려주는 변수라면, 왜 할당할 변수의 자료형을 앞에 써주어야 할까?

만약 포인터 변수를 통해 주소값에 접근할려고 하면, 할당된 변수의 주소로 가게된다.

하지만, 이때 문제가 생긴다.

주소의 단위는 바이트인데, 앞으로 몇바이트를 가야 이 할당된 변수에 접근할 수 있는지 모른다.

주소는 가장 첫 바이트의 주소를 따른다.

예를 들어 int형 변수는 4바이트인데, 포인터 변수가 int형 변수라는 것을 모르면,

4바이트의 값을 차지해야 하는지 모르기 때문에, 메모리 처리 과정에서 심각한 오류가 발생할 것이다!

⇒따라서 포인터 변수를 선언할 때에는, 이 변수가 몇바이트를 차지해야 할지, 자료형을 적어주는 것이다.

int, float변수 모두 4바이트인데, 주소값 할당이 가능할까?

포인터 변수는 차리할 크기에 따라 자료형을 적어주어야 한다.

근데, 크기가 같지만 형식이 다른 int와 float에게도 적용될까?

float F = 5.5;
    int* pointer = (int*)&F;
    cout << *pointer << endl;

위 코드는 float형 변수 F를 가리키는 int형 포인터의 참조 값을 출력하는 코드이다.

과연 5.5가 출력이 될까?

⇒아니다. 포인터 선언시 앞에 붙혀주는 자료형은 단순히 크기 정보만 알려주는 것이 아니다!!

포인터 변수 안의 주소를 참조시 어떤 형식으로 바라보는지에 대한 정보도 함꼐 들어있다.

즉, 부동소수점형의 표현 방식과, 정수형의 표현 방식은 다르기 때문에 같은 크기의 포인터 변수라 할지라도, 관점의 차이 떄문에 이 코드는 5.5가 출력되지 않는다!!!!!!

**포인터는 몇 바이트의 크기를 차지할 건지, 그리고 어떤 관점으로 바라볼 건지의 정보를 모두 포함한다!

즉, 해당 포인터에세 전달된 주소를 해석하는 단위이다!**

주소연산자 "&"

int i=100;
int* Pint=&i;

변수 이름 앞에 사용하는 &라는 연산자는, 그 변수의 주소를 반환한다.

포인터 변수에는 주소값만 들어갈 수 있기 떄문에 일반 변수의 부소를 할당해줄 때에는

주소 연산자를 이용해서 값을 할당해 주어야 한다.

따라서 이 코드는, Pint라는 포인터 변수 안에는 i의 주소가 저장되었다는 뜻이 된다.

참조연산자 "*"

int i=100;//1
i=200;//2

1번의 코드에서 i의 값을 바꾸고 싶다면??

⇒2번처럼 변수 i를 호출하여 값을 바꿔주면 될 것이다.

int i=100;
int* Pint=&i;
*Pint=200;

하지만 우리는 이제 주소를 통해서 값을 바꿔줄 수 있다.

포인터 변수 Pint는 i의 주소값을 가진다.

즉, Pint가 가리키고 있는 값을 수정해준다면, i의 값을 바꾸는 것과 같을 것이다!

*는, 현재 포인터 변수가 기리키고 있는 값을 반환하는 연산자이다.

주소의 참조를 통해서 값을 바꿀 수도 있다!

728x90