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