1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문
1. 표준입출력 표준입출력 입력 : 키보드, scanf 함수 출력 : 모니터, printf 함수문제 : 정수값 2개를입력받고두값사이의값들을더하여출력하라. #include <stdio.h> int main(void) int Num1, Num2; int Sum = 0; int i; // 전처리문사용 // main 함수 // 변수선언 // 변수선언및초기화 주소전달 서식문자 : int 형 - %d printf("2개의정수입력 : "); scanf("%d %d", &Num1, &Num2); for (i = Num1; i <= Num2; i++) Sum += i; // 출력 // 입력 // 제어문 // 연산자 값전달 printf("%d 부터 %d 까지의합 : %d\n", Num1, Num2, Sum); return 0; 1 장 C 언어복습 1
2. 배열 배열 : 같은타입의변수여러개를묶어서처리 배열변수선언및초기화의예 int Grade[5]; Grade[2] = 100; // 지역변수의경우쓰레기값을가짐 // 세번째원소의값을 100 으로변경 int Grade[5] = 10, 20, 30, 40, 50 ; int Grade[5] = 10, 20 ; int Grade[5] = 0 ; // Grade[2] 이후로는 0 값을가짐 // 모두 0 값을가짐 int Grade[2][3] = 10, 20, 30, 40, 50, 60 ; // 2 차원배열 Grade[1][1] = 100; // 2 행 2 열원소의값을 100 으로변경 1 장 C 언어복습 2
2. 배열 문제 : 5 행 5 열의 int 형배열을선언하고실행결과와같이각원소의값을채운후출력하기 int main(void) int Ary[5][5]; int i, j; // 2 차원배열 for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) if (i >= j) // 왼쪽아래부분 : i + 1 Ary[i][j] = i + 1; else // 오른쪽위부분 : 0 Ary[i][j] = 0; for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) printf("%d ", Ary[i][j]); printf("\n"); return 0; 1 장 C 언어복습 3
3. 포인터 : 프로그램과메모리 실행중인프로그램 ( 프로세스 ) 의메모리구조 1 장 C 언어복습 4
3. 포인터 : 메모리주소 메모리주소 주소 : 바이트단위의번호 주소를 8비트로표현한다면 à 2 8 개 (0~255번지) 의주소값 Windows 운영체제에서는 32비트로표현 à 2 32 개 (0~2 32-1번지) 프로세스 1개당 4GByte의전용메모리 ( 가상메모리 ) 가할당됨 변수와함수의주소 변수와함수는메모리공간을차지함 1 장 C 언어복습 5
3. 포인터 : 변수와포인터 변수의주소 : 주소연산자 (&) 사용 int num = 5; printf(" 변수 num의주소 : %d\n", &num); 포인터 : 주소값을저장하는변수 타입별로다르게표현됨 à 포인터변수를통해간접처리가능 예 : int형포인터변수 1 장 C 언어복습 6
3. 포인터 : 변수와포인터 포인터변수를통한변수접근 : 역참조연산자 (*) 사용 int *pnum = # *pnum = 5; (num = 5; 와동일 ) 포인터연산 : 증가 (++), 감소 (--), 덧셈 (+), 뺄셈 (-) 가능 int 형포인터의경우 1 증가 : int 형변수의크기인 4 만큼증가함 예제 int main(void) int var = 5; int *p = &var; // 포인터변수선언및 var 주소로초기화 printf("var의주소 : %d\n", &var); printf("var의값 : %d\n", var); printf("p의주소 : %d\n", &p); printf("p의값 : %d\n", p); printf("p가가리키는변수의값 : %d\n", *p); int 형이므로 4 증가 p++; printf(">> 변경후 \n"); printf("p의값 : %d\n", p); return 0; 1 장 C 언어복습 7
4. 배열과포인터 배열은포인터처럼, 포인터는배열처럼사용가능! 배열에대한포인터연산의적용예 배열첫번째원소의주소대입 다음원소를가리킴 pnum[0], pnum[1], 과같이사용가능 pnum[2] == *(pnum + 2) 주의 : 배열명에대한주소변경불가 à 상수개념 1 장 C 언어복습 8
4. 배열과포인터 : 메모리동적할당 메모리동적할당및해제함수 malloc(), free() 예제 : 10 개의원소를갖는 int 형배열에대한메모리동적할당 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) int i, ary[10], *p; srand((unsigned) time(null)); for (i = 0; i < 10; i++) ary[i] = rand(); // srand, rand 함수 // time 함수 // 무작위값대입 p = (int *) malloc(sizeof(int) * 10); // int 형 10 개메모리동적할당 for (i = 0; i < 10; i++) p[i] = ary[i]; // 포인터는배열처럼사용가능 printf("index\tary\tp\n"); for (i = 0; i < 10; i++) printf("%d\t%d\t%d\n", i, ary[i], p[i]); free(p); return 0; // 메모리해제 malloc 의반환형 : void * à 형변환필요 à C 에서는자동형변환됨 1 장 C 언어복습 9
5. 함수 함수작성시고려사항 함수원형, 함수정의, 함수호출, 매개변수전달 예제 : x y 을계산하는함수 #include <stdio.h> int power(int x, int y) int i; int result = 1; for (i = 0; i < y; i++) result *= x; return result; 값에의한전달 int main(void) int a = 2; int b = 3; int result = power(a, b);// 함수호출 printf("%d^%d : %d\n", a, b, result); a = 3; b = 4; result = power(a, b); printf("%d^%d : %d\n", a, b, result); return 0; 1 장 C 언어복습 10
5. 함수 : 매개변수전달방식 값에의한전달 예제 : swap 함수 문제점은? void swap(int x, int y) int temp = x; x = y; y = temp; int main(void) int a = 2; int b = 3; 값에의한전달 printf("a : %d, b : %d\n", a, b); swap(a, b); printf("a : %d, b : %d\n", a, b); return 0; 1 장 C 언어복습 11
5. 함수 : 매개변수전달방식 참조에의한전달 예제 : swap 수정 void swap(int *x, int *y) int temp = *x; *x = *y; *y = temp; int main(void) int a = 2; int b = 3; 참조에의한전달 printf("a : %d, b : %d\n", a, b); swap(&a, &b); 주소전달 printf("a : %d, b : %d\n", a, b); return 0; 1 장 C 언어복습 12
5. 함수 : 매개변수전달방식 배열의전달 배열의전달 값에의한전달불가 첫번째원소의주소를전달 à 참조에의한전달사용 예제 int 형배열포인터, 원소개수 void SetArray(int *ary, int count) int i; int main(void) int i; int Ary[5]; SetArray(Ary, 5); 배열의첫번째원소주소, 원소의개수전달 for (i = 0; i < count; i++) ary[i] = i * i; 포인터를배열처럼사용 for (i = 0; i < 5; i++) printf("%d : %d\n", i, Ary[i]); return 0; 1 장 C 언어복습 13
6. const 와포인터 const 상수선언 const double PI = 3.14; 변수 PI의값변경불가 함수매개변수의상수화 int sum(const int x, const int y) return (x + y); 함수내에서 x, y의값변경불가 실매개변수로일반변수와 const 상수모두사용가능 형식매개변수가 const가아닌경우에는실매개변수로 const 상수불가 const 와포인터 int *pnum = # 1 장 C 언어복습 14
6. const 와포인터 1. num 의상수화 const int *pnum = # 2. pnum 의상수화 int * const pnum = # 예제 : const 의사용 int main(void) int var1 = 1; int var2 = 2; const int *p1; 선언과동시에초기화 //int * const p2; int * const p2 = &var1; p1 = &var1; p1 = &var2; //*p1 = 5; var2 = 4; *p2 = 3; //p2 = &var2; 포인터를통해값변경불가 변수자체는변경가능 다른변수로변경불가 printf("var1 : %d\n", var1); printf("var2 : %d\n", var2); return 0; 1 장 C 언어복습 15
7. 구조체 구조체 동질또는이질적인데이터여러개를하나의그룹으로처리 사용자정의형 예 : 2 차원평면상의한점 구조체변수대입 O 배열은대입 X 구조체배열가능 구조체의멤버변수로배열가능 이경우에도대입가능 P1 = P2; struct Point int x; int y; // 구조체선언 1 장 C 언어복습 16 ; struct Point P1, P2; // 변수선언 P1.x = 5; P1.y = 6; // 변수사용 struct Point Sum(struct Point P1, struct Point P2); struct Point Ary[10]; struct Student char name[20]; int id; int score; ; 값에의한전달가능
7. 구조체 예제 : 2 차원평면상의한점을위한 Point 구조체사용 struct Point int x, y; ; struct Point Sum(struct Point P1, struct Point *P2) struct Point Po; Po.x = P1.x + P2->x; Po.y = P1.y + P2->y; return Po; 구조체변수의선언및초기화 int main(void) struct Point A = 1, 2 ; struct Point B = 3, 4 ; struct Point C; P1 : 값에의한전달, P2 : 참조에의한전달 구조체포인터의멤버는 -> 로접근 (*P2).x 와동일 C = Sum(A, &B); A : 값전달, B : 주소전달 printf("point C : (%d, %d)\n", C.x, C.y); return 0; 1 장 C 언어복습 17
7. 구조체 : 단방향링크드리스트 예제 : 단방향링크드리스트만들기 #include <stdio.h> #include <stdlib.h> struct Node int data; struct Node *next; ; int main(void) int i; struct Node *pstart = NULL; struct Node *pend = NULL; struct Node *Current; // 첫번째노드포인터 // 마지막노드포인터 1 장 C 언어복습 18
7. 구조체 : 단방향링크드리스트 for (i = 1; i <= 5; i++) // 노드생성 Current = (struct Node *) malloc(sizeof(struct Node)); Current->data = i; Current->next = NULL; if (pstart == NULL) pstart = pend = Current; else pend->next = Current; pend = Current; // 첫번째노드 // 노드추가 // 첫번째노드부터출력 Current = pstart; while (Current!= NULL) printf("%d\n", Current->data); Current = Current->next; return 0; 1 장 C 언어복습 19
8. 컴파일러사용방법 프로그램작성및수행과정 컴파일러의종류 Visual C++ : Windows 운영체제, 통합개발환경제공 Visual C++ 6.0 : Visual Studio 98, 아직까지도많이사용되고있음 VC++ 8.0 : VS 2005, VC++ 9.0 : VS 2008 VC++ 10.0 : 최신버전, VS 2010에포함 gcc : UNIX 운영체제 그외다수 컴파일러의선택 어떤컴파일러라도상관없음 자신의컴퓨터사용환경에따라적절히선택하여사용하면됨 본강의에서배우는것은컴파일러의사용방법이아닌표준 C++! 1 장 C 언어복습 20
8. 컴파일러사용방법 본강의에서사용하는컴파일러 Visual C++ 6.0 또는 Visual C++ 8.0 이후 à 표준 C++ 차원 ( 콘솔프로그래밍 ) 에서는거의유사함 VC++ 6.0 VC++ 8.0 사용방법 : 교재참고 부록 1 : Visual C++ 6.0 부록 2 : Visual C++ 8.0 1 장 C 언어복습 21