System Software Experiment 1Lecture 5 - ArraySpring 2019
Hwansoo Han ([email protected])Advanced Research on Compilers and Systems, ARCS LAB
Sungkyunkwan Universityhttp://arcs.skku.edu/
1
배열 (Array)Array))
• 동일한 타입의 데이터가 여러 개 저장되어 있는 저장 장소• 배열의 이름은 그 배열의 시작 주소를 의미
2
int main(Array)){ int i0; int i1; … int i9;}
int main(Array)){ int i[10]; // i[0] ~ i[9]}
배열 선언• 자료형 이름 [ 크기 ];• 배열 번호 (Array) 인덱스 ) 는 항상 0 부터 시작
3
int main(Array)){ int score[10]; // 10 개의 int 형 값을 가지는 배열 가지는 배열 score float height[10]; // 10 개의 float 형 값을 가지는 배열 가지는 배열 height char name[20]; // 20 개의 char 형 값을 가지는 배열 가지는 배열 name}
배열 접근
4
int main(Array)){ int score[10]; score[2] = 91;}
91score
score[0]
score[1]
score[2]
score[9]
배열 초기화• 배열의 크기가 주어지지 않으면 초기값의 개수만큼 설정
5
int main(Array)){ int score[5] = {10, 20, 30};}
score 10 20 30 0 0
score[0]
score[1]
score[2]
int main(Array)){ int score[] = {10, 20, 30};}
score 10 20 30
score[0]
score[1]
score[2]
배열 크기 계산
6
int main(Array)){ int score[] = {10, 20, 30, 40, 50}; int i, size;
size = sizeof (Array)score) / sizeof (Array)score[0]); // 4 * 5 / 4 = 5 for (Array)i = 0; i < size; i++) { printf(Array)“Score: %d\n”, score[i]); }}
배열과 포인터• 배열의 시작 주소를 포인터 변수에 저장 가능
7
int main(Array)){ int array)[3] = {10, 20, 30}; int *pointer = array); printf(Array)“%d %d\n”, array)[0], pointer[0]); printf(Array)“%d %d\n”, array)[1], *(Array)pointer+1)); printf(Array)“%d %d\n”, array)[2], pointer[2]);}
10 1020 2030 30
배열과 포인터• 배열의 시작 주소는 상수 형태의 주소 값으로 변경이 불가• 포인터 변수는 저장된 주소 값의 변경이 가능• name2 에 문자열 상수 “ Seokha” 의 시작 주소를 저장• name2 에 문자열 상수 “ Gy)usun” 의 시작 주소를 저장
8
int main(Array)){ char name[6] = “Gy)usun”; name = “Seokha”; // complie error
char *name2 = “Seokha”; name2 = “Gy)usun”;}
Example - 배열• Array) 에 5 개의 float 형 데이터를 입력받아 평균을 가지는 배열 출력하는 프로그램 생성
9
배열과 함수• 배열이 인자인 경우 , 배열 원본을 가지는 배열 전달• 배열 원본의 변경을 가지는 배열 원치 않는 경우 , const 변수 사용
10
int get_average(Array)int[], int);
int main(Array)){ int score[5] = {10, 20, 30, 40, 50}; int average;
average = get_average(Array)score, 5); printf(Array)“Average: %d\n”, average);
return 0;}
int get_average(Array)int score[], int num)// int get_average(Array)const int score[], int num){ int i; int sum = 0;
for (Array)i = 0; i < num; i++) { sum += score[i]; }
return sum / n;}
다차원 배열• 선 , 면 , 입체 , … → 1 차원 , 2 차원 , 3 차원 , ...• 선언 및 초기화
11
int main(Array)){ int score[5][5]; int array)[2][3] = {{1, 2, 3}, {4, 5, 6}}; score[2][3] = 91;}
91
score
score[0][0]score[1][0]score[2][0]score[3][0]score[4][0]
score[2][3]
다차원 배열과 함수• 배열 인자의 두 번째 인덱스는 반드시 기입
12
#define CLASS 2#define STUDENTS 5int get_average(Array)int[][STUDENTS], int);int main(Array)){ int score[CLASS][STUDENTS] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int average;
average = get_average(Array)score); printf(Array)“Average: %d\n”, average);
return 0;}
int get_average(Array)int score[][STUDENTS]){ int I, j; int sum = 0;
for (Array)i = 0; i < CLASS; i++) { for (Array)j = 0; j < STUDENTS; j++) { sum += score[i]; } }
return sum / (Array)CLASS * STUDENTS);}
포인터 배열
13
int main(Array)){ int num1 = 1, num2 = 2; int *array)[2];
array)[0] = &num1; array)[1] = &num2;
printf(Array)“%d\n”, *array)[0]); printf(Array)“%d\n”, *array)[1]);}
12
Example – 다차원 배열• 3*3 행렬 2 개를 더한 행렬을 가지는 배열 출력• 행렬 인자 하나당 3 칸씩 출력을 가지는 배열 할당
14
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9+ =
?
배열 동적할당• malloc(Array)size)• 요청한 메모리 바이트만큼 할당• void * 형 시작 주소를 return
15
int main(Array)){ char *a = (Array)char *)malloc(Array)sizeof (Array)char) * 4);
a[0] = 4; // *a = 4; a[1] = 5; // *(Array)a+1) = 5;}
5
4
RAM
0x0
…
a[0]
a[1]
a[2]
a[3]
배열 동적할당• calloc(Array)size a, size b)• b 사이즈만큼 a 개의 메모리 할당• 모든 할당받은 메모리를 0 으로 초기화
• realloc(Array)void *p, size)• 메모리 공간의 확장 또는 축소• 할당된 포인터 p 에 대해 size 로 크기를 변경
16
int main(Array)){ char *a = (Array)char *)calloc(Array)sizeof (Array)char) * 4); a = (Array)char *)realloc(Array)p, sizeof (Array)char) * 6);}
RAM
0x0
…
배열 동적할당• calloc(Array)size a, size b)• b 사이즈만큼 a 개의 메모리 할당• 모든 할당받은 메모리를 0 으로 초기화
• realloc(Array)void *p, size)• 메모리 공간의 확장 또는 축소• 할당된 포인터 p 에 대해 size 로 크기를 변경
17
int main(Array)){ char *a = (Array)char *)calloc(Array)sizeof (Array)char) * 4); a = (Array)char *)realloc(Array)p, sizeof (Array)char) * 6);}
0
0
0
0
RAM
0x0
…
a[0]
a[1]
a[2]
a[3]
배열 동적할당• calloc(Array)size a, size b)• b 사이즈만큼 a 개의 메모리 할당• 모든 할당받은 메모리를 0 으로 초기화
• realloc(Array)void *p, size)• 메모리 공간의 확장 또는 축소• 할당된 포인터 p 에 대해 size 로 크기를 변경
18
int main(Array)){ char *a = (Array)char *)calloc(Array)sizeof (Array)char) * 4); a = (Array)char *)realloc(Array)p, sizeof (Array)char) * 6);}
?
?
0
0
0
0
RAM
0x0
…
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
배열 동적할당 - 다차원
19
int main(Array)){ int i = 0; char **a = (Array)char **)malloc(Array)sizeof (Array)char *) * 2);
for (Array)i = 0; i < 2; i++) { a[i] = (Array)char *)malloc(Array)sizeof (Array)char) * 4); }
a[0][0] = 4; // *a = 4; a[1][2] = 5; // *(Array)a+1) = 5;}
5
4
RAM
0x0
…
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
Exercise 1 – 오름차순 , 내림차순• 10 개의 int input 에 대해 오름차순 , 내림차순으로 출력
20
Exercise 2 - Minesweeper
• 제시되어 있는 지뢰 위치에 따라 지뢰찾기가 완료된 상태를 출력• malloc 으로 배열 할당• char 형으로 출력
• 숫자 0: 48 or ‘0’• 기호 *: 42 or ‘*’
21
* * * *
* *
*
*
* *
* * *
* * *
* * *
*
9 * 9
Exercise 2 - Minesweeper
• 제시되어 있는 지뢰 위치에 따라 지뢰찾기가 완료된 상태를 출력• malloc 으로 배열 할당• char 형으로 출력
• 숫자 0: 48 or ‘0’• 기호 *: 42 or ‘*’
22