새로 생성한 스크립트
진입점
- 프로젝트가 시작되면 가장 먼저 실행되는 지점 (MAin)
실행
특수문자 사용
- \를 사용한다.
- \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#과 같다.
- 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에 연결된다.
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;
}
- int a = 10; int* b = &a; //이건 값을 저장한게 아니라 할당을 선언한것이다. int** c = &b; //2차 포인터 **c = 20; //ㅁrk 20으로 바뀐다.