[배열 기초]
VC 기준으로 배열의 크기는 상수로 지정해야 한다. gcc는 아님
배열의 이름은 배열의 시작주소. 시작 주소를 가리키는 TYPE* 포인터이다.
[포인터 vs 배열]
![](https://blog.kakaocdn.net/dn/DEG3t/btrKFRL2yQd/1kmvYQ9ZumM0JRUVsRYex1/img.png)
둘은 서로 다르다.
test1은 Hello World가 .data 영역(아마도 .rodata)에 존재하는 "Hello World"의 주소를 대입하는건데 read only이기 때문에 값 변경이 불가능하다.
test2는 .data 영역에 존재하는 "Hello World"를 4(8)바이트씩 끊어서 복사한다. 복사해온 값이기 때문에 값 수정이 가능하다.
배열을 함수의 인자로 넘기게 되면 배열의 시작 주소만 넘기게 된다.
컴파일러가 알아서 포인터로 치환하는 것이다.
[로또 번호 생성기]
별거 없음
[다중 포인터]
이중 포인터 사용시 스택프레임
main SetMessage
[매개변수][RET][지역변수(msg(Hello주소))] [매개변수(a(&msg))][RET][지역변수]
*a = "Bye"; 를 실행 시 의도한 결과가 나온다. 일차원 포인터로는 char로 이루어진 문자열을 건드리는 것은 call by value나 다름없다.
다중 포인터는 그냥 양파까기라고 생각하면 된다.
const char*& a 같은 문법도 사용이 가능하다.
[다차원 배열]
메모리 할당된것을 보면 성능, 구조적으로 1차원 배열과 똑같이 할당되어있다.
사용시 약간의 계산 순서 차이는 있지만 1차원 배열과 2차원 배열은 다를 게 없다.
3차원 배열 이상 사용하는 경우는 거의 없다.
2차원 배열은 대표적으로 2D 로그라이크 맵 생성에 이용한다.
[포인터 마무리]
TYPE형 1차원 배열과 TYPE*형 포인터는 완전히 호환이 된다.
2차원 배열과 2차원 포인터는 전혀 호환이 안된다.
주소값을 다룰 때는 그 주소가 끝까지 유효한지 항상 유의해야 한다.
스택 영역 데이터의 주소값을 밖으로 넘겨줄때는 조심해야한다.
[파일 분할 관리]
헤더파일의 내용은 최대한 간결하게 유지하는 것이 좋다.
클래스 전방선언때 한번 더 언급할 예정
'C++ > Rookiss C++' 카테고리의 다른 글
[동적 할당] 동적 할당 (0) | 2022.08.28 |
---|---|
[객체지향 여행] (0) | 2022.08.28 |
[포인터] #1/2 (0) | 2022.08.26 |
[함수] (0) | 2022.08.26 |
[코드의 흐름 제어] (0) | 2022.08.26 |