공부/Unity

24.04.18

월러비 2024. 4. 18. 22:18

새로 생성한 스크립트

  • Main
  • Name
  • Pointer

진입점

  • 프로젝트가 시작되면 가장 먼저 실행되는 지점 (MAin)

실행

  • Ctrl + F5

특수문자 사용

  • \를 사용한다.
  • \n : 한줄 띄어쓰기 (Enter)

컴파일 순서

  • C# : C# → CIL(중간 언어) → exe 파일 생성
  • C++ : cpp → 전처리기( : 헤더파일과 함께 #으로 작성된것을 처리한다.) → 컴파일 → (obj) 파일 생성 → Linker (외부 라이브러리를 전부 가져온다.) → exe 파일 생성

포인터

  • 변수 뒤에 *을 붙여 선언한다.
    • &는 주소를 집어넣는다는 의미다.
    • 위의 코드는 int b의 공간에 a의 주소를 집어넣는다는 의미다.
    • 데이터 크기는 자료형과 상관없이 CPU가 정해준다.
    • *을 함수에 쓴다는것은 주소가 기리키는 주소의 값을 사용할 수 있다는 것이다.
    • 포인터도 변수이기 때문에 주소가 다르고 그렇다면, a와는 다른 변수다.
  • int a = 10; printf("a = %d\\n", a); printf("&a = %p\\n", &a); //주소(포인터)의 출력은 %p로 한다. int* p = &a; printf("p = %p\\n", p); //a의 주소이니 &a와 같은 출력이 나온다. printf("*p = %d\\n", *p); //포인터의 내부 실제값은 10이기 띠문에 %d로 출력한다. printf("&p = %p\\n", &p); //포인터도 변수이기 때문에 주소가 다르고 그렇다면, a와는 다른 변수다.
  • 주소(포인터)의 변수 출력은 %p로 한다.

포인터

*b 20;
printf("a = %d\\n", a);
printf("*p = %d\\n", *p);
  • *변수에 값을 넣는다는것은 포인터가 기리키는 주소에 값을 사용하겠다는 뜻이다.
    • 위의 코드는 a의 값이 바뀌었고, a의 주소를 가리키는 포인터 p의 값도 바뀌었다.

포인터 사용 (함수 매개변수)

  • 포인터 주소(&)를 넘긴다면, 함수에서 받는것은 주소의 값(*)을 받아야한다.
void Swap(int e, int f)
{
	int temp = e;
	e = f;
	f = temp;
}

int main()
{
	int a = 10;
	int b = 20;

	printf("a = %d, b = %d\\n", a, b);

	Swap(a, b);

	printf("a = %d, b = %d\\n", a, b);

	return 0;
}
  • 위에처럼 사용하면 값이 바뀌지 않는다.
  • 자료형&는 C#의 Ref와 같은 동작을 한다. ⇒ C#과 같다.
    • a와 b의 값이 바뀐다.
  • void Swap(int& e, int& f) { int temp = e; e = f; f = temp; }
#include<stdio.h>

void Swap(int* e, int* f)
{
	int temp = *e;
	*e = *f;
	*f = temp;
}

int main()
{
	int a = 10;
	int b = 20;

	printf("a = %d, b = %d\\n", a, b);

	Swap(&a, &b);

	printf("a = %d, b = %d\\n", a, b);

	return 0;
}
  • 이게 포인터를 사용하여 값을 교체하는 정석이다.

값을 전달하는 방식

void Test(int b)
{
	''
}
int a = 10;
Test(a);
  • 위의 코드가 ‘Call by Value’
    • 값을 복사해서 값만 넘겨준다. (값이 바뀌지 않는다)
void Test(int& b)
{
	''
}
int a = 10;
Test(a);
  • 위의 코드가 ‘Call by Reference; ⇒ C#은 여기까지만 있다.
    • 이건 객체를 넘겨주는 것이다.
void Test(int* b)
{
	''
}
int a = 10;
Test(&a);
  • C++은 위의 코드가 있고, ‘Call by Address’라고 부른다.
    • 주소를 넘겨주는 것이다.

박싱

int a = new int();
  • 값 형식이 참조 형식으로 바뀌는것이니 박싱이 일어난다.(녹음 듣자)
  • 이렇게 주소를 할당하는 것을 ‘동적 할당’이라고 한다.

C++ 동적 할당

int * a = new int();
*a = 10;
void Alloc(int* p)
{
	p = new int9);
	*p = 10;
}

int* a = nullptr;
Alloc(a);
printf(*a); //10이 안나오고 null 나온다.
  • C에서는 초기화를 안하면 이상한 값이 들어간다.
    • 선언 후 초기화를 반드시 해줘야한다.
    • null을 쓸때는 nullptr이라는 명령어를 쓴다.
  • 위 결과 이유 :
    • p는 함수 내부에 선언된 ‘지역변수’이기 때문에 함수가 끝나면 소멸한다.
    • 값을 전달하기 전에 삭제된다.
  • int* p = a; //nullptr 들어감
  • 해결법 :
    • int* b = &a ⇒ 이건 값을 저장한게 아니라 할당을 선언한것이다.
    • 2차 포인터 : 포인터 연결을 2번하는 것이다.
    • *c ⇒ b에 연결된다.
      • a(**C) → b(*C) → c(C)

    2차 포인터

    int value = 5;
    int * a = &value;
    int ** b = &a; // 이중 포인터! 포인터의 포인터. 포인터 변수 a의 주소값.
    
    void Alloc(int* p)
    {
    	p = new int();
    	*p = 10;
    }
    
    int main()
    {
    	int* a = nullptr;
    	Alloc(a);
    
    	printf("a = %d\\n", a);
    
    	return 0;
    }
    
    • 값이 안나오고 에러가 뜬다.
    • 해결법
    void Alloc(int** p)
    {
    	*p = new int();
    	**p = 10;
    }
    
    int main()
    {
    	int* a = nullptr;
    	Alloc(&a);
    
    	printf("*a = %d\\n", *a);
    
    	return 0;
    }
    
    • 2차 포인터를 쓰는 이유
    • 2차 포인터의 역할
  • int a = 10; int* b = &a; //이건 값을 저장한게 아니라 할당을 선언한것이다. int** c = &b; //2차 포인터 **c = 20; //ㅁrk 20으로 바뀐다.

'공부 > Unity' 카테고리의 다른 글

24.04.22  (0) 2024.04.22
24.04.19  (0) 2024.04.22
24.04.17  (1) 2024.04.17
24.04.16  (0) 2024.04.16
24.04.15  (0) 2024.04.15