그냥 게임개발자

포인터 본문

C++ 나만의 복습

포인터

sudoju 2024. 4. 5. 00:12

포인터란?

 

0x00000..... 같은 주소를 담는 타입이 포인터다.

주소를 담는 타입

adress를 담는 Type

int는 정수를 담지요?

float는 실수를 담지요?

pointer는 주소를 담는다

그것도 첫번째 바이트 주소를 가리킨다.

 

예를 들자

 

여기서 int라는 타입을 선언하게되면 메모리에 이렇게 담기게 된다.

그렇다면 int*는 무엇을 담는 것인가?

지금 int라는 타입을 처음 메모리에 할당할 때 처음 주소는 0x000000이다.

그렇게 해서 0x000000 ~ 0x000003까지 사용하는 것이다.

그러면 int*는 0x000000을 담는 즉 첫번째 byte주소를 담는 타입이다.

 

또한 포인터는 메모리 동적할당, 데이터를 복사하지 않으며 함수 매개변수로 사용, 클래스 및 구조체를 연결할 때 사용이 된다.

 

예를 들어 Node라는 것을 생각해보면

첫번째 Node#1클래스에는 data를 가지고 있다.

이 data는 next*라는 포인터 변수를 가지고 있는데 이 변수가 담고 있는 것은

Node#2클래스 데이터를 가지고 있는 것이 아닌

Node#2의 주소를 가지고 있는 것이다.

 

이것이 바로 싱글 연결리스트이다.

 

그러면 prev라는 포인터가 있으면 더블 연결리스트가 되는 것이다.

 

class Node
{
public:
    int data;
    Node* prev;
    Node* next;
}

이와 같다고 보면 된다.

 

이게 좋은 점은 Node의 전체적인 데이터를 몰라도 주소만 알면 참조해서 값을 사용할 수 있다.

#include <iostream>

using namespace std;

int a = 4;

int main()
{
    <타입> * <변수명> = <해당 타입의 변수의 주소>
    int *b = &a;
}

이렇다.

타입을 꼭 맞추어야 한다!!!

 

#include <iostream>

using namespace std;

int a = 4;

int main()
{
    <타입> * <변수명> = <해당 타입의 변수의 주소>
    double *b = &a;
}

 

이런식으로 쓰면 절대 안된다 이것이야.

 

여기서 *라는 별표는 에스터 리스크(asterisk operator)라고 불린다.

 

int 	인트타입
int * 	인트형 포인터 타입

포인터가 많이 어렵다.

 

그렇다면 직접 사용해보자.

 

#include <iostream>

using namespace std;

double a = 4.4;

int main() {
    cout << &a << '\n';
    double *b = &a;
    cout << b << '\n';

    return 0;
}

 

이거는 똑같은 주소가 나올 수밖에 없다.

a의 변수의 주소를 출력하고

b는 a의 주소를 가지고 있고

b를 출력하면 당연히 똑같은 값이 나온다.

 

이렇게 말이다.

 

그렇다면 이 b의 크기는 얼마일까?

double은 8byte인데

그렇다면 double형 포인터는..?

 

생각해보자.

 

int*와 double*는 크기가 같을까?

 

이거는 운영체제에 따라 다르다

 

32bit 64bit 많이 들어보지 않았나?

그거에 따라 다르다

 

32bit컴퓨터를 사용한다는 가정하에

int*의 크기는 4byte이다.

double*의 크기는 똑같이 4byte이다.

 

결국 운영체제에 따라 포인터의 크기는 달라진다.

아 여기서 그러면 64bit에서는?

int*의 크기는 8byte이다.

double*의 크기는 똑같이 8byte이다.

 

크기는 고정되어 있다.

 

'C++ 나만의 복습' 카테고리의 다른 글

unique()  (0) 2024.04.07
역참조 연산자  (0) 2024.04.05
auto 타입  (0) 2024.04.04
pair와 tuple  (0) 2024.04.04
float, double  (0) 2024.04.04