C Programming Practice (II)
Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17
배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용 예 ) myarray[0] = 100; 첫번째원소에 100 을치홖한다. myarray[2] = 150; 세번째원소에 150 을치홖한다. C 에서배열젂체를다른배열에치홖할수없다. 예 ) char a1[10], a2[10]; a2=a1 : 잘못된문장 a1[3] = a2[4] : 올바른문장 3/17
배열 (Array) (2/2) 다차원배열 2차원이상의배열 type var_name[size1][size2]; 예 ) 2차원배열 int twod[3][5]; 배열의초기화 각각의원소를직접초기화 예 ) int a[3]; a[0]=1; a[1]=2; a[2]=4; type array-name[size] = {value-list}; 예 ) int a[5] = {1, 2, 4}; 4/17
문자열 문자열 C에서문자열은 null-terminated character array 로정의된다. 배열의크기는문자열의크기보다 1byte 더커야한다. 문자열상수는컴파일러에의해자동으로 NULL로종료됨. 예 ) Char name[5] = herb ; h e r b /0 name[3]= x ; h e r x /0 5/17
포인터와주소 주소 (Address) 모든변수는메모리상의특정위치에저장되고그위치를주소라한다. & 연산자 변수의주소를알아내는연산자 예 ) int a = 3; printf( %d, %d, a, &a); 반드시기억장소에존재하는변수를피연산자로가져야함 6/17
포인터 (pointer)(1/2) 포인터 기억장소의위치 ( 주소 ) 를저장하는변수 포인터변수의선얶 : type *pointer-variable; int *a; int b = 3; int *a a = &b 참조연산자 * a = &b; 포인터변수가가리키는주소에적혀있는값을의미 예 ) int x = 1, y = 2, z[10]; int *ip; /* ip is a pointer to int */ ip = &x; /* now ip points to x */ y = *ip; /* y is now 1 */ *ip = 0; /* x is now 0 */ ip = &z[0]; /* now ip points to z[0] */ int b = 3; 7/17
포인터 (pointer)(2/2) 주소산술 p 가포인터라면 p++ 는기억장소에서바로다음원소를가리키도록 p 를증가 type *p; 일때 p++ 은포인터는 1 만큼증가하지만실제로기억장소의주소는 sizeof(type) 만큼증가됨 포인터와정수는연산에서호홖되지않음 0 은예외적으로지정또는비교에사용 <stdio.h> 의심볼상수 NULL 은포인터와관렦하여 0 대싞에사용 (c.f. Java : null) int *p; p = NULL; /* make p point to nothing */ if (p == NULL)... /* test if p is NULL pointer */ 포인터 p 에 NULL 을지정하면포인터는기억장소의어떤위치도가리키고있지않다는것을의미 8/17
포인터와배열 배열의이름과포인터의유사점 배열의이름은배열의첫번째원소의주소와같다 pa = &a[0]; 은 pa = a; 과동일 배열 a의원소 a[i] 를 *(a+i) 로나타내는것도가능 &a[i] 와 a+i는동일한의미를가짐 pa[i] 는 *(pa+i) 와같은의미를나타냄 배열의이름과포인터의차이점 포인터는변수이고배열의이름은변수가아니다 포인터의경우는다음과같은연산이가능 pa = a; pa++; 배열의이름은다음과같은연산이허용되지않음 a = pa; a++; 9/17
Calling Convention (1/2) Call by Value 호출함수의변수값이복사되어피호출함수의인자로호출됨 Call by Reference 호출함수의변수가피호출함수의인자로호출됨 C 의경우 모든함수 calling convention 은 Call by Value 호출함수에서피호출함수이변경한변수의결과를사용하려면값을변경시키려는인자를포인터로젂달하여야함 Java 의경우 primitive type 은 call by value, 그외는 call by reference 10/17
Calling Convention (2/2) void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a = 4; int b = 7; swap( &a, &b ) } void swap(int a, int b) { int temp; temp = a; a = b; b = temp; } int main() { int a = 4; int b = 7; swap( a, b ); } 11/17
메모리의동적할당 Malloc (memory allocation) 형식 : void *malloc(size_t size); 프로토타입 : <stdlib.h> 기능 : malloc 함수는크기가 size 인객체 ( 기억장소 ) 를할당한다. 리턴값 : 영역할당이성공한때는확보된영역의선두포인터를되돌려준다. 영역할당이실패한경우는 NULL 을되돌려준다. 예 ) int *p; p = (int *)malloc(1 * sizeof(int)); Free ( 메모리의해제 ) 동적할당한메모리는반드시책임지고해제해야한다. 형식 : void free(void *p); 프로토타입 : <stdlib.h> 기능 : free 는 p 가가리키는기억장소를해제한다. 단 p 가 NULL 일때는아무일도하지않는다. p 는 malloc 등에의하여이젂에할당되었던기억장소의포인터이어야한다. 12/17
구조체 (Structure) (1/2) 구조체란? 하나의이름으로불려지는서로다른형의변수들의모임 Java 에서멤버변수만존재하는클래스와비슷한개념 구조체정의 : struct 구조체이름 {type1 name1; type2 name2; }; 구조체변수선얶 : struct 구조체이름변수명 ; 구조체는배열이나포인터로도선얶가능 struct point { int x; int y; } struct { int x; int y; } center; struct point center;... 13/17
구조체 (Structure) (2/2) 구조체멤버변수접근 구조체이름. 멤버변수이름 ex) int a = center.x + 20; 구조체포인터 구조체의포인터는구조체의첫멤버변수의주소를가리킨다 -> 연산자 : 구조체포인터로부터멤버변수를나타냄 a->x 는 *a.x 와동일한의미, -> 는우선순위가 ++ 보다높다. struct point *center, a={32,24}; center = &a; center->x; (*center).y; 14/17
연습문제 1. 사용자로부터 n x n 의크기를입력받아임의의 integer 숫자로채우고두배열의곱을계산하여출력하는프로그램을작성하라. (rand() 함수를이용하라. man 페이지참조 ) malloc 을사용하여야함. 2. 가변크기 stack 의 push, pop 함수를구현하라. 이때 stack 은 linked list 를이용하여야하며, 이를 test 할수있는 main 함수를설계하고구현하라. 3. 2. 에서작성한프로그램을수정하여 queue 를구현하여라. 15/17