[f5]
- 디버그 시작/ 정지
[ctrl + f5]
- 디버그 종료 or 디버그 하지 않고 시작.
[f9]
- 중단점 설정 / 끄기
[ctrl + shift + f9]
- 중단점 모두 지우기
[f10]
- 디버그 현재 라인 실행(한 줄 씩), 함수를 만나면 함수 안으로 들어가지 않음
[f11]
- 디버그 함수의 경우 함수 내부로 들어가서 실행 (즉, 프로시저 단위로 실행)
[f12]
- 현재 디버그 하고 있는 함수 빠져나오기
배열 배열의 규칙
- 배열은 연속된 메모리 공간에 할당된다. ⭐
- 배열의 이름은 연속된 메모리 공간의 첫번째 주소다.⭐ &array[0] = array = > 정확하게는 상수형 포인터. (하나의 주소만 가르치고 있는 것.) 즉, array라는 배열 이름은 주소에 해당하는 리터럴 상수라고 볼 수도 있음
- 배열은 중괄호 식을 통해서 초기화 한다.
배열의 개수보다 초기화 값이 적을 때에는 0으로 초기화된다.
int arr[3] = {1,2} ==>{1,2,0} - 배열을 선언할 때에는 []안에 반드시 상수가 위치해야 한다.( 즉, 변수는 안됨.)
int a 는 들어갈 수 없으나, const int a는 들어갈 수 있음즉 심볼릭 상수를 넣을 수 있음. - 중괄호 식을 통해 초기화 하는 원소의 개수를 알려주면 그 개수만큼 자동 생성이 된다.
- 배열의 연산자 안에서 수식이 가능하다.
iArray [ 2 +3]이 연산자의 경우에는 변수도 들어갈 수 있다. (선언이 아니니까) - 배열의 원소끼리 연산이 가능하다.
- 배열 ㅅㅇ성 이후 시점에는 인덱스를 지칭하는 변수가 위치할 수 있다.
- sizeof연산자에 배열 이름을 삽입할 경우 배열 전체의 크기를 계산할 수 있다.
모던 c++이후로 제공되는 함수
size(array): 사이즈 문법for(int i : array)범위 기반 for
render(int arry[]);
render(int* arr);
두 가지가 동일하지만, 포인터가 아닌 배열을 전달할 때에는 관행적으로 저렇게 표현하는 것이 좋다.
보통 배열을 함수로 넘길 때, 배열이 아닌 포인터로 매개인자를 넘기게 되는데 이런 경우에는 포인터 변수로 복사 받는 것이기 때문에 배열의 크기가 전달되지 않음. 그래서 매개인자로 배열의 크기를 함께 보내줘야함.
int arr[행][열] ={{},{},{}}
int arr[2][3]
{
{1,2,3},
{4,5,6}
}
direct X 에서 행렬 많이 씀.
arr[0] = 주소. 왜냐면 arr[0]은 arr[0][0], arr[0][1], arr[0][2] 을 관리하는 하나의 배열’이름’이기 때문에. 그렇기에 arr과 arr[0]은 같은 값
int * p[2] = {arr[0], arr[1]}
포인터에도 배열을 삽입할 수 있음.
다만, 2차원 배열의 이름은 포인터와 이중 포인터로 가리킬 수 없다
2차원 배열의 이름은, 자료형 (*변수명)[열]
int pArr[2][3];
int (*pArray)[3] = pArr;
RENDER(int (*pArray)[3])
- 2바이트 이상의 글자 집합
여러 개의 문자를 저장하려면 반드시 연속된 메모리 공간이 필요 - 즉, 배열이 필요함.
char szName [5] = {'j','u','s','i','n'};
szName = "hello";
-> szName은 주소를 뜻하는 rValue이기에 불가한 문법.
cout << szNamem <<endl;
원래라면 주소가 나와야 하지만, cout이라는 함수의 특성상, 문자열의 경우에는 주소가 아니라 문자가 출력이 됨.
그러나, 컴파일러는 어디까지가 문자열의 끝인지 알 수 없기에 문자열의 끝을 알려주는 ‘\0’을 삽입해주어야 한다.
char szName [6] = {'j','u','s','i','n','\0'};
char szName [6] = {'j','u','s','i','n'}; → 남은 부분은 자동으로 0으로 초기화.
또한 한글자씩이 아닌
char szName [6] = {"jusin"}; → 상수 문자열 (항상 \0 이 자동으로 삽입)
여기서 char szName [6] 와 {"jusin"};은 독립적인 메모리 공간을 활용함.
임시 메모리 공간에 글자를 저장한 뒤, 맨 앞에 주소를 반환하는 형태.
문자열 포인터의 경우, 쓰기가 불가능함. 그러나 배열의 크기가 필요 없음. 문자열 배열의 경우, 쓰기가 가능함. 그러나 배열의 크기가 필요.
숙제
25-02-27 이중포문과 배열 25-02-27 회전 2차원 배열 25-02-27 로또만들기 25-02-27 야구게임 만들기
컴파일 타임 상수 →리터럴 런타임 타임 상수 →심볼릭
“정적 초기화 된”(스택에 할당된)어레이 크기의 조건( 컴파일 타임 상수)
void func(int x){
const int a = x + 5;
int array[a]={};
-> 이건 안됨. 왜냐면 런타임 상수이기 때문에.
}
constexpr int a는 컴파일 과정에서 컴파일러가 판단하지 않고, 그냥 상수로 됨. 이건 판단을 하지 않기 때문에 가장 빠르다. 그래서 컴파일 상수 쓸 때에는 무조건 쓰면 좋다.
동적 할당 어레이는 신경 쓰지 않아도 된다.