11장 포인터

Similar documents
제 15 장전처리및비트연산 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - ch 전처리기, 다중 소스파일 pm1015

<4D F736F F F696E74202D20C1A63135C0E520C0FCC3B3B8AEB9D7BAF1C6AEBFACBBEA>

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap12-고급기능.pptx

ch15

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

OCW_C언어 기초

중간고사

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

C++-¿Ïº®Çؼ³10Àå

K&R2 Reference Manual 번역본

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

슬라이드 1

11장 포인터

Microsoft PowerPoint - chap08-1 [호환 모드]

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

untitled

쉽게 풀어쓴 C 프로그래밍

C 프로그래밊 개요

Microsoft PowerPoint - chap04-연산자.pptx

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

untitled

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

슬라이드 1

<4D F736F F F696E74202D20C1A635C0E520BCF6BDC4B0FABFACBBEAC0DA>

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - 08_(C_Programming)_(Korean)_Preprocessing

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - Chapter14_17.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

untitled

Microsoft PowerPoint - Chapter8.pptx

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - chap08.ppt

Microsoft PowerPoint - chap10-함수의활용.pptx

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

본 강의에 들어가기 전

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - ch07 - 포인터 pm0415

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - chap-11.pptx

8장. 포인터

C 언어 프로그래밊 과제 풀이

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

chap7.key

Microsoft PowerPoint - chap-06.pptx

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 08_C_Language_Preprocessor

PowerPoint Presentation

untitled

Microsoft PowerPoint - chap-05.pptx

BMP 파일 처리

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - chap01-C언어개요.pptx

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

untitled

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

PowerPoint Presentation

Microsoft PowerPoint - 05장(함수) [호환 모드]

슬라이드 1


Microsoft PowerPoint - chap-03.pptx

11장 포인터

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

歯9장.PDF

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관


PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson2.pptx

OCW_C언어 기초

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

Transcription:

누구나즐기는 C 언어콘서트 제 13 장전처리및기타기능

이번장에서학습할내용 전처리지시어 분할컴파일 명령어라인의매개변수 디버깅방법 전처리와기타중요한테마에대하여학습한다.

전처리기란? 전처리기 (preprocessor) 는컴파일하기에앞서서소스파일을처리하는컴파일러의한부분

전처리기의요약 지시어 #define #include #undef #if #else #endif #ifdef #ifndef #line #pragma 의미매크로정의파일포함매크로정의해제조건이참일경우조건이거짓일경우조건처리문장종료매크로가정의되어있는경우매크로가정의되어있지않은경우행번호출력시스템에따라의미가다름

단순매크로 단순매크로 (macro): 숫자상수를기호상수로만든것 ( 예 ) #define MAX_SIZE 100 #define PI 3.141592 #define EPS 1.0e-9 100 보다는 MAX_SIZE 가이해하기쉽지..

단순매크로

단순매크로의장점 프로그램의가독성을높인다. 상수의변경이용이하다. 기호상수를사용하는경우 숫자를사용하는경우

단순매크로의예 #define PRINT printf #define PI 3.141592 // 원주율 #define TWOPI (3.141592 * 2.0) // 원주율의 2배 #define MAX_INT 2147483647 // 최대정수 #define EOF (-1) // 파일의끝표시 #define MAX_STUDENTS 2000 // 최대학생수 #define EPS 1.0e-9 // 실수의계산한계 #define DIGITS "0123456789" // 문자상수정의 #define BRACKET "(){}[]" // 문자상수정의 #define getchar() getc(stdin) // stdio.h에정의 #define putchar() putc(stdout) // stdio.h에정의 214748364 7 보다는 MAX_INT 가낫죠 사람은숫자보다기호를잘기억합니다.

중간점검 1. 숫자상수를기호상수로정의하는데사용되는전처리지시자는 # 이다. 2. #define 을이용하여서하나의텍스트를다른텍스트로정의할수있는가?

함수매크로 함수매크로 (function-like macro) 란매크로가함수처럼매개변수를가지는것 ( 예 ) #define SQUARE(x) ((x) * (x))

함수매크로의예 #define SUM(x, y) ((x) + (y)) #define AVERAGE(x, y, z) (( (x) + (y) + (z) ) / 3 ) #define MAX(x,y) ( (x) > (y) )? (x) : (y) #define MIN(x,y) ( (x) < (y) )? (x) : (y)

주의할점 #define SQUARE(x) x*x // 위험!! v = SQUARE(a+b); v = a + b*a + b; 함수매크로에서는매개변수를괄호로둘러싸는것이좋습니다. #define SQUARE(x) (x)*(x) // 올바른형태

예제 // 매크로예제 #include <stdio.h> #define SQUARE(x) ((x) * (x)) int main(void) { int x = 2; printf("%d\n", SQUARE(x)); printf("%d\n", SQUARE(3)); printf("%f\n", SQUARE(1.2)); printf("%d\n", SQUARE(x+3)); printf("%d\n", 100/SQUARE(x)); printf("%d\n", SQUARE(++x)); // 실수에도적용가능 // 논리오류 ((++x) * (++x)) } return 0; 4 9 1.440000 25 25 16

함수매크로의장단점 함수매크로의장단점 함수호출단계가필요없어실행속도가빠르다. 소스코드의길이가길어진다. 간단한기능은매크로를사용 #define MIN(x, y) #define ABS(x) ((x) < (y)? (x) : (y)) ((x) > 0? (x) : -(x))

중간점검 1. 함수매크로는함수보다속도가느린가? 2. 3 제곱을수행하는함수매크로를정의하여보자.

#ifdef 어떤조건이만족되었을경우에만컴파일하는조건부컴파일지시 #ifdef 매크로문장1 #else 문장2 #endif // 매크로가정의되었을경우 // 매크로가정의되지않았을경우

#ifdef 의예

예제

예제

비주얼 C++ 에서설정하는방법

중간점검 1. 전처리기지시자 #ifdef 을사용하여 TEST 가정의되어있는경우에만화면에 TEST" 라고출력하는문장을작성하여보자.

#if 기호가참으로계산되면컴파일 조건은상수이어야하고논리, 관계연산자사용가능

#if-#else-#endif ( 예 ) #if NATION == 1 #include "korea.h" #elif NATION == 2 #include "china.h" #else #include "usa.h" #endif

다양한예 #if (VERSION > 3)... #endif // 버전이 3 이상이면컴파일 #if (VERSION > 3.0) #endif // 오류!! 버전번호는 300 과같은정수로표시 #if (AUTHOR == "CHULSOO") // 오류!! #endif

다양한예 #if (AUTHOR == KIM) #endif // 가능!! KIM 은다른매크로 #if (VERSION*10 > 500 && LEVEL == BASIC) // 가능!! #endif #if (VERSION > 300 defined(deluxe) ) // 가능!! #endif

조건부컴파일을이용하는디버깅 #define DEBUG 1... #if DEBUG == 1 printf(" 현재 counter 의값은 %d 입니다.\n", counter); #endif

조건부컴파일을이용하는디버깅 #define DEBUG... #ifdef DEBUG printf(" 현재 counter 의값은 %d 입니다.\n", counter); #endif... #if defined(debug) printf(" 현재 counter 의값은 %d 입니다.\n", counter); #endif

다수의라인을주석처리 #if 0 // 여기서부터시작하여...... #endif // 여기까지주석처리된다.

헤더파일이중포함방지 /*** *stdio.h - definitions/declarations for standard I/O routines ****/ #ifndef _INC_STDIO #define _INC_STDIO...... #endif 헤더파일이포함되면매크로가정의되어서이중포함을방지합니다.

예제 정렬알고리즘을선택 #define SORT_METHOD 3 #if (SORT_METHOD == 1)... // 선택정렬구현 #elif (SORT_METHOD == 2)... // 버블정렬구현 #else... // 퀵정렬구현 #endif

중간점검 1. #if 를사용하여 DEBUG 가 2 일경우에만 DEBUG" 가나오도록문장을작성하라. 2. #if 를사용하여 DEBUG 가 2 이고 LEVEL 이 3 인경우에만 DEBUG" 가나오도록문장을작성하라.

다중소스파일 단일소스파일 파일의크기가너무커진다. 소스파일을다시사용하기가어려움 다중소스파일 서로관련된코드만을모아서하나의소스파일로할수있음 소스파일을재사용하기가간편함

다중소스파일

예제 multiple_source.c // 다중소스파일 #include <stdio.h> #include "power.h" int main(void) { int x,y; printf("x 의값을입력하시오 :"); scanf("%d", &x); printf("y 의값을입력하시오 :"); scanf("%d", &y); printf("%d 의 %d 제곱값은 %f\n", x, y, power(x, y)); power.h // power.c 에대한헤더파일 #ifndef POWER_H #define POWER_H double power(int x, int y); #endif power.c // 다중소스파일 #include "power.h double power(int x, int y) { double result = 1.0; int i; } return 0; for(i = 0;i < y; i++) result *= x; } return result;

헤더파일을사용하지않으면

헤더파일을사용하면

다중소스파일에서외부변수

비주얼 C++ 에서다중소스파일

중간점검 1. 다음문장의참거짓을말하라. 여러소스파일을이용하는것보다하나의소스파일로만드는편이여러모로유리하다. 2. 팩토리얼을구하는함수가포함된소스파일과관련헤더파일을제작하여보자.

main() 함수의인수 지금까지의 main() 함수형태 int main(void) {.. } 외부로부터입력을받는 main() 함수형태 int main(int argc, char *argv[]) {.. }

인수전달방법 C: \cprogram> mycopy src dst m y c c o o p y \0 \0 argv[0] s s r r c c \0 \0 argv[1] d s s t t \0 \0 3 3 argv[2] argc argv 배열

main_arg.c #include <stdio.h> int main(int argc, char *argv[]) { int i = 0; for(i = 0;i < argc; i++) printf(" 명령어라인에서 %d 번째문자열 = %s\n", i, argv[i]); } return 0; Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\cprogram\mainarg\debug>mainarg src dst 명령어라인에서 0 번째문자열 = mainarg 명령어라인에서 1 번째문자열 = src 명령어라인에서 2 번째문자열 = dst c:\cprogram\mainarg\debug>

비주얼 C++ 프로그램인수입력방법

mile2km.c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { double mile, km; if( argc!= 2 ){ printf(" 사용방법 : mile2km 거리 \n"); return 1; } mile = atof(argv[1]); km = 1.609 * mile; printf(" 입력된거리는 %f km 입니다. \n", km); } return 0; Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\cprogram\mainarg\debug>mainarg 10 입력된거리는 16.090000 km 입니다. c:\cprogram\mainarg\debug>

중간점검 1. main() 의 argv[0] 에는무엇이들어있는가? 2. C>test a b c 라고도스창에서입력하였다면 argc, arv[] 에는어떤값들이들어가는가?

디버깅 소스에존재하는오류를잡는것

디버깅 디버깅 : 논리오류를찾는과정

디버거의실행과정

디버거의실행과정

디버거의실행과정

디버거의명령어정의

중간점검 1. 디버깅시에단축기 F10 과 F11 의차이점은무엇인가? 2. 중단점 (breakpoint) 이란무엇인지인터넷에서조사하여보자.

비트단위연산자 C 에서는비트단위의연산도가능하다. 비트단위연산자는정수에만적용이가능하다. 연산자 연산자의의미 설명 & 비트 AND 두개의피연산자의해당비트가모두 1이면 1, 아니면 0 비트 OR 두개의피연산자의해당비트중하나만 1이면 1, 아니면 0 ^ 비트 XOR 두개의피연산자의해당비트의값이같으면 0, 아니면 1 << 왼쪽으로이동 지정된개수만큼모든비트를왼쪽으로이동한다. >> 오른쪽으로이동 지정된개수만큼모든비트를오른쪽으로이동한다. ~ 비트 NOT 0은 1로만들고 1은 0로만든다.

비트논리곱연산자 비트1 비트2 비트1 & 비트2 0 0 0 0 1 0 1 0 0 1 1 1 변수 1 00000000 00000000 00000000 00001101 (13) 변수 2 00000000 00000000 00000000 00001110 (15) ------------------------------------------------------- ( 변수 1 AND 변수 2) 00000000 00000000 00000000 00001100 (12) 변수 1 00000000 00000000 00000000 00001101 (13) 마스크 00000000 00000000 00000000 00000111 (7) ------------------------------------------------------- ( 마스크연산후 ) 00000000 00000000 00000000 00000101 (5) 마스크연산으로많이사용

비트논리합연산자 비트1 비트2 비트1 비트2 0 0 0 0 1 1 1 0 1 1 1 1 변수 1 00000000 00000000 00000000 00001001 (9) 변수 2 00000000 00000000 00000000 00001010 (10) ------------------------------------------------------- ( 변수 1 OR 변수 2) 00000000 00000000 00000000 00001011 (11) 비트설정연산으로많이사용 변수 1 00000000 00000000 00000000 00001001 (9) 비트설정 00000000 00000000 00000000 00000111 (7) ------------------------------------------------------- ( 비트 OR 연산후 ) 00000000 00000000 00000000 00001111 (15)

비트배타논리합연산자 비트1 비트2 비트1 ^ 비트2 0 0 0 0 1 1 1 0 1 1 1 1 변수 1 00000000 00000000 00000000 00001001 (9) 변수 2 00000000 00000000 00000000 00001010 (10) ------------------------------------------------------- ( 변수 1 XOR 변수 2) 00000000 00000000 00000000 00000011 (3)

비트부정연산자 비트 1 ~ 비트 1 0 1 1 0 부호비트가반전되었기때문에음수가된다. 변수 1 00000000 00000000 00000000 00001001 (9) ------------------------------------------------------- (NOT 변수 1) 11111111 11111111 11111111 11110110 (-10)

예제 #include <stdio.h> int main(void) { int x = 9; // 1001 int y = 10; // 1010 printf(" 비트 AND = %08X\n", x & y); // 1000 printf(" 비트 OR = %08X\n", x y); // 1011 printf(" 비트 XOR = %08X\n", x ^ y); // 0011 printf(" 비트 NOT = %08X\n", ~x ); // 0110 } return 0; 비트 AND = 00000008 비트 OR = 0000000B 비트 XOR = 00000003 비트 NOT = FFFFFFF6

비트이동연산자 연산자기호설명 왼쪽비트이동 << x << y x 의비트들을 y 칸만큼왼쪽으로이동 오른쪽비트이동 >> x >> y x 의비트들을 y 칸만큼오른쪽으로이동 00000000 00000000 00000000 00001111 처음상태 (15) 00000000 00000000 00000000 00001111 왼쪽으로비트이동 삭제 00000000 00000000 00000000 00001111 삽입 경계를벗어나는비트를삭제하고오른쪽빈곳은채운다. 00 00000000 00000000 00000000 00111100 최종상태 (60) 왼쪽비트이동연산

오른쪽비트이동연산 ( 양수 ) 부호비트는 0 00000000 00000000 00000000 00001111 처음상태 (15) 부호비트가 0 이므로 0 을삽입한다. 00 00000000 00000000 00000000 00001111 00000000 00000000 00000000 00001111 00000000 00000000 00000000 00000011 삭제 오른쪽으로비트이동 경계를벗어나는비트를삭제한다. 최종상태 (3) 오른쪽비트이동연산 ( 양수 )

오른쪽비트이동연산 ( 음수 ) 부호비트는 1 11111111 11111111 11111111 11110011 처음상태 (-11) 부호비트가 1 이므로 1 을삽입한다. 11 11111111 11111111 11111111 11110011 11111111 11111111 11111111 11110011 삭제 오른쪽으로비트이동 경계를벗어나는비트를삭제한다. 11111111 11111111 11111111 11111100 최종상태 (-2) 오른쪽비트이동연산 ( 음수 )

예제 #include <stdio.h> int main(void) { int x = 9; // 1001 printf(" 비트 << = %08X\n", x << 2);// 100100 printf(" 비트 >> = %08X\n", x >> 2);// 000010 } return 0; 비트 << = 00000024 비트 >> = 00000002

중간점검 1. 비트를지정된숫자만큼왼쪽으로이동시키는연산자는 이다. 2. 비트의값을 0 에서 1 로, 1 에서 0 으로바꾸는데사용하는연산자는 이다. 3. 변수 x 의값을 2 배로하려면 쪽으로비트를이동시키면된다. 4. 변수 x 의값을 1/2 배로하려면 쪽으로비트를이동시키면된다.

비트필드구조체 멤버가비트단위로나누어져있는구조체 struct 태그이름 { 자료형멤버이름 1: 비트수 ; 자료형멤버이름 2: 비트수 ;... }; struct product { unsigned style : 3; unsigned size : 2; unsigned color : 1; }; unsigned int 1 2 3 color size style

bit_field.c // 비트필드구조체 #include <stdio.h> struct product { unsigned style : 3; unsigned size : 2; unsigned color : 1; }; style=5 size=3 color=1 sizeof(p1)=4 p1=ccccccfd int main(void) { struct product p1; p1.style = 5; p1.size = 3; p1.color = 1; printf("style=%d size=%d color=%d\n", p1.style, p1.size, p1.color); printf("sizeof(p1)=%d\n", sizeof(p1)); printf("p1=%x\n", p1); } return 0;

비트필드사용시에주의점 struct product { }; long code; // 1 일반멤버도가능하다. unsigned style : 3; unsigned : 5; // 2 자리만차지한다. unsigned size : 2; unsigned color : 1; unsigned : 0; // 3 현재워드의남아있는비트를버린다. unsigned state : 3; // 여기서부터는다음워드에서할당된다. 비트필드의응용분야 : 하드웨어포트제어

중간점검 1. 구조체의일종으로멤버들의크기가비트단위로나누어져있는구조체는 이다. 2. 비트필드구조체를정의하는경우, 자료형은 이나 을사용하여야한다.

Q & A