조건문
1) If
if( 조건1 ) {
조건1이 만족할 때의 처리; //나머지는 수행 안 한다
}
else if( 조건2 ){
조건2가 만족할 때의 처리;
}
else{
모든 조건이 아닐 때의 처리
}
2) Switch문 (제어문)
여러 개 중에 하나를 선택하는 것
ex. 자판기버튼을 생각하면 된다! 버튼을 누르면 입력값에 맞는 걸 결과로 받게 된다.
주의할 건 브레이크문!
int a=0, b=1;
switch(a) {
case 0 : printf("%d\\n", b++); break;
case 1 : printf("%d\\n", ++b); break;
default : printf("%d\\n", b); break;
}
- a에 0, b에 1가 들어있는 정수 선언
- switch문을 a를 가지고 수행한다
- a는 0이니까 case 0을 수행하라는 뜻
- 먼저 b를 수행하고나서, ⭐
- 그 다음에 b값을 1 증가시키게 된다. ⭐
- 따라서 결과값은 1, 현재 b에 들어있는 값은 2
- 만약 여기에 break 가 없다면? ⭐
- 먼저 1값을 출력하고, b에는 2값.
- break가 없으니 case1도 수행.
- 즉 break를 만날 때까지 다음 식을 순차적으로 수행 ⭐
- b = 3 → 출력
- default도 수행 3 출력
- 만약 switch(1)이고, break가 다 없다면? ⭐
- case 1부터 시작해서 break를 만날때까지 다음식을 순차적으로 수행한다. ⭐
반복문
- for
- 정해진 횟수만큼 반복
- while(조건)
- 조건이 만족하는 동안 반복
- do ~ while(조건)
- 일단 무조건 한번 수행 후
- 조건이 만족하는 동안 반복
for
for ( 초기식; 조건식; 증감식 )
{
수행하는 작업들
}
while문
while ( 조건 )
{
수행하는 작업들
}
do ~ while
do
{
수행하는 작업들
} while (조건)
countinue
더이상 아래 문장 실행X 반복문 처음으로 돌아감
반복문에서만 사용한다
break
반복문을 빠져나감 (for문 자체를)
배열
같은 자료형의 변수를 연속적으로 묶어 놓은 저장공간
선언
int a [5] ;
자료형 배열명 개수
C와 Java는 0부터 시작해서
a[0] a[1] a[2] a[3] a[4]
a라는 변수는 따로 만들어짐. a[0] 메모리의 주소값을 가지고 있다.
int a [5];
a[0] = 10; // 값 대입
a[2] = 20; // 값 대입
a[6] = 60; // 오류 발생
이차원 배열
같은 자료형의 변수를 행과 열의 연속적인 공간으로 묶어 놓은 것
포인터
포인터란?
메모리의 위치를 표현한 기호
주소값을 가지고 있는 변수
포인터 변수 선언
int *a;
- a를 포인터변수라고 선언 (a는 임의의 주소값을 가지고 있어!)
이후 a가 나오면 a공간의 값에~ 라고 읽으면 된다.
*a = 10;
- a주소가 갖고있는 값은 10이다!
printf("%d", a); //a주소값
- a주소가 출력된다 (임의의 주소값)
printf("%d", *a); //a주소가 갖고있는 값
- a공간의 값이니 10이 출력된다
변수의 주소 찾기
변수는 모두 주소를 갖고 있다
int b = 10;
// b에 10이라는 값을 집어넣는다 (일반변수영역)
int *a;
// a라는 포인터변수 공간이 생성된다 (포인터영역)
a = &b;
// a공간에 b의 주소값을 넣는다.
// b와 포인터변수a 모두 b주소를 가리킨다
printf("%d\\n", *a);
// b공간이 가리키는 값 10이 출력
printf("%d\\n", a);
// a와 연결된 b주소가 출력된다
printf("%d\\n", b);
// b는 일반 변수니 10이 출력
- 일반변수 b의 값에 10을 넣는다
- *a라는 포인터변수 공간이 생성된다.
- a주소에 b주소를 넣는다
- *a 출력 = a주소가 갖고있는 값 = b공간이 가리키는 값 10 출력
- a 출력 = a주소값 출력 = 연결된 b주소값 출력
- b 출력 = b는 일반변수이므로 그냥 10이 출력된다
배열과 포인터
포인터는 주소값을 가지고 있다.
배열도 주소값을 가지고 있다. 0번지의 주소값을!
배열과 포인터의 관계
포인터도 배열처럼 인덱스 사용 가능
- int a[5];
- a라는 정수형 변수 5개 선언
- a[0] ~ a[4]이 만들어진다
- int *b = a;
- 포인터변수 b에는 a주소가 들어간다
- a[2] = 10;
- a의 3번째 공간에 10을 대입
- b[2] = 20;
- 포인터변수 2번째 공간이면 배열과 똑같다!!
- = a[2]
2차원 배열과 포인터
지금까지 해왔던 건 1차원!
int a [3][2] = {{1,2], {3,4}, {5,6}};
3행 2열의 2차원 a배열
printf("%d\\n", a);
// a값 = 갖고있는 주소 100번지를 출력한다.
printf("%d\\n", *a);
// a의 값 = a[0]을 가리키고 있는 것이지 1을 가리키고 있는 것이 아니다.
// 따라서 주소 100번지가 출력된다
printf("%d\\n", **a);
// a의 값(100번지)의 값 1 출력. 2차 포인터
포인터 배열
배열의 요소가 포인터(메모리주소)로 이루어진 것.
일반적인 배열
char a[3] = {'a', 'b', 'c'};
printf("%s\\n", a); //abc
%s : 문자열 출력
a의 주소값을 받아서 문자열을 출력하는 것이다. null을 만날때까지!
char *str = "Hello";
printf("%s\\n", str); //Hello
주소값 받아서 출력!
포인터변수
char *student[3] = {"aaa", "bbb", "ccc");
포인터인데 배열로 만든 것!
기존 포인터는 하나의 주소만 가졌는데, 이건 포인터배열이라 [3] → 3열의 주소를 갖게 된다.
즉, 각각의 배열 요소에 주소값이 들어가는 것!
“aaa”, “bbb”, “ccc”는 문자열로 생성된다.
배열 포인터
2차원 형태로 재구성 (논리적으로만)
- *in 포인터 변수
- *in[] 포인터 배열
- (*in)[] 배열 포인터
int arr[2][3] = {{1,2,3}, {4,5,6}};
// 2행 3열인 정수형 배열 arr
int (*in)[2];
// 2열인 배열포인터 in을 생성 (2차원배열)
in = (int *)arr; //arr를 in에 연결시키고 형변환
printf("%d\\n", **in);
printf("%d\\n", **(in+1));
printf("%d\\n", *(*in+1));
printf("%d\\n", in[0][1]);
printf("%d\\n", in[1][0]);
- in = (int *)arr : int형으로 형변환한다는 뜻
- 배열 변수명은 주소값이라 딱히 의미는 없다
함수 malloc
동적으로 메모리에 공간을 할당하라는 뜻
sizeof : 바이트 길이를 구하라
예를 들어 malloc( 3 * 3 * sizeof(int))
int가 들어갈 수 있는 사이즈(4바이트)의 3*3배열을 만들라는 뜻
물리적으로 연속된 공간이라는 거 잊지 말자!