Download
slide1 n.
Skip this Video
Loading SlideShow in 5 Seconds..
Chapter 10 문자열 PowerPoint Presentation
Download Presentation
Chapter 10 문자열

Chapter 10 문자열

97 Views Download Presentation
Download Presentation

Chapter 10 문자열

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Chapter10 문자열

  2. 문자열 문자열이란? • 널문자(\0)로 끝나는 char타입 배열 문자열 정의 방식 • 문자열 상수 • char 배열 • char 포인터 • 문자열의 배열 문자열 상수 • 큰 따옴표로 둘러싸인 모든 문자들 • 큰 따옴표로 둘려싸인 문자들 끝에 컴파일러에 의해 자동으로 ‘\0’문자가 더해져서 메모리에 문자열로 저장 • #define을 이용하여 정의되기도 함 • 메모리 공간 내에서 static storage class에 위치함

  3. 문자열 배열 문자열 배열 • char 타입의 문자들을 하나의 이름아래 배열로 묶어 놓은 것 • 문자열 배열 정의 시에 컴파일러에게 필요한 공간의 크기를 알려주어야 한다. • 배열 크기는 반드시 배열 요소의 개수보다 적어도 1 큰수를 지정하여 널문자를 위한 공간을 마련한다. 문자열 배열의 초기화 • 다른 타입의 초기화 방법과 비슷하게 이루어짐 • 배열 크기를 직접 줄 수도 있고 초기화를 겸할 경우 생략할 수도 있다. • 배열 크기가 초기화 문자열의 크기보다 큰 경우 사용되지 않는 배열 요소는 널문자로 자동 초기화된다. #define MAXLEN 81 //최대 문자열 길이 + 1 char name[MAXLEN]; //최대 80개의 문자를 입력할 수 있는 배열 const char msg1[ ] = “Hello”; //배열 크기를 주기 않고 컴파일러에게 맡김 const char msg2[ ] = {‘H’,’e’,’l’,’l’,’o’,’\0’};

  4. 문자열 배열과 문자열포인터 문자열 배열(msgarr[]) • 저장공간 크기 : 17 • msgarr이라는 이름은 주소를 나타내긴 하지만 주소가 바뀔 수 없는 상수 • msgarr+1, msgarr+10과 같은 연산 가능 • msgarr++, msgarr– 과 같은 연산 불가능 문자열 포인터(msgptr) • 저장공간 크기 : 17 • 포인터 이므로 주소가 바뀔 수 있다. • msgptr+1, msgptr+10과 같은 연산 가능 • msgptr++, msgptr—과 같은 연산 불가능 char msgarr[] = “Nice to meet you”; //문자열 배열 char * msgptr = “Nice to meet you”; //문자열 포인터

  5. 문자열들의 배열 문자열배열의 배열(whatday1) • 크기가 10인 문자열 배열을 7개 가진다. 문자열 포인터들의 배열 (whatday2) • 크기가 일정하지 않은 문자열을 가리키는 포인터 7개를 가진다. char whatday1[7][10] = { “Sunday”, ”Monday”, “Tuesday”, ”Wednesday”, “Thursday”, ”Friday”, ”Saturday” }; char *whatday2[7] = { “Sunday”, ”Monday”, “Tuesday”, ”Wednesday”, “Thursday”, ”Friday”, ”Saturday” };

  6. 문자열 함수 – string.h(I) • src가 가리키는 문자열(널문자 포함)을 dest가 가리키는 위치에 복사한다. • 반환값 : dest • src가 가리키는 문자열을 dest가 가리키는 위치에 num개의 문자만 복사한다. • 널문자 이후의 문자는 복사되지 않는다. • 소스 문자열이 num보다 짧을 경우 dest에는 널문자가 나머지 부분을 채운다. • 반환값 : dest char *strcpy (char *dest, const char *src ); char *strncpy (char *dest, const char *src, size_t num );

  7. 문자열 함수 – string.h(II) • dest가 가리키는 문자열의 끝에 src가 기리키는 문자열을 복사한다. • src문자열의 첫번째 문자는 dest 문자열의 널문자를 덮어쓴다. • 반환값 : dest • src문자열의 처음 num개의 문자만 dest가 가리키는 문자열의 끝에 복사된다. • 반환값 : dest char * strcat (char * dest, const char * src); char * strncat(char * dest, const char * src, size_t num);

  8. 문자열 함수 – string.h(III) • string1과 string2를 비교한다. • string1 < string2 인 경우의 반환값 : < 0 (0보다 작은 수) • string1 > string2 인 경우의 반환값 : > 0 (0보다 큰 수) • string1 = string2 인 경우의 반환값 : 0 • string1의 num개의 문자와 string2의 num개의 문자를 비교한다. • 반환값 : 위의 strcmp의 경우와 같다. int strcmp (const char * string1, const char * string2); int strncmp (char * string1, const char * string2, size_t num);

  9. 문자열 함수 – string.h(IV) • string에서 c문자를 찾는다. • 반환값 : c문자가 발견되면 처음으로c 문자가 나타나는 위치를 반환하고, 발견하지 못하면 NULL이 반환된다. • string에서 c문자를 찾는다. • 반환값 : c문자가 발견되면 마지막으로c 문자가 나타나는 위치를 반환하고, 발견하지 못하면 NULL이 반환된다. char * strchr (const char * string, int c ); char * strrchr (const char * string, int c );

  10. 문자열 함수 – string.h(V) • 두개 문자열의 문자들을 하나씩을 비교해가면서 string2 문자열에 있지 않은 문자가 string1에서 처음 나타났을 때, 그 문자 바로 전까지의 길이를 반환한다. size_t strspn (const char * string1, const char * string2 ); size_t strcspn (const char * string, int c ); • 두개 문자열의 문자들을 하나씩을 비교해가면서 string2의 문자열에 포함되어 있는 문자가 string1에 존재할 때, 처음으로 나타난 문자의 위치를 반환한다.

  11. 문자열 함수 – string.h(VI) • string의 길이를 반환한다. size_t strlen (const char * string ); char * strpbrk (const char * string1., const char * string2 ); • string1에서 string2의 문자들 중 같은 문자를 발견하면 처음 문자를 반환한다.

  12. 문자열 함수 – string.h(VII) • string1에서 string2가 처음으로 나타나는 위치를 찾아서 그 위치를 가리키는 포인터를 반환한다. char * strstr ( const char * string1, const char * string2 ); char * strtok (const char * string., const char * delimiters ); • string을 delimiters들 중 하나로 분리한다.

  13. 명령행 인수 main() • 정해진 매개변수(인수)를 가질 수 있다. • argc : argument count (명령행 문자열의 개수) • argv : argument value (명령행 문자열 포인터의 배열) 프로그램의 실행 • 유닉스와 DOS Command Line에서 프로그램의 이름으로 실행시 필요한 인수를 함께 전달한다. int main ( int argc, char * argv[] ) 또는 int main ( int argc, char * * argv ) C:\Example> Cexample 10 20 Hello // Cexample : 프로그램 이름 //10, 20, Hello : 세개의 문자열이 프로그램 수행에 필요한 인수

  14. 연습문제 • strlen()을 사용하지 않고 문자열의 길이를 구하는 함수를 구현하시오. • strcpy()를 사용하지 않고 문자열을 복사하는 함수를 구현하시오. • strcmp()를 사용하지 않고 문자열을 비교하는 함수를 구현하시오. • strstr()을 사용하지 않고 두개의 문자열을 받아서 첫번째 문자열에서 두번째 문자열의 위치를 찾아서 반환하는 함수를 구현하시오. • atoi()를 사용하지 않고 문자열을 int형으로 변환하는 함수를 구현하시오. • 대문자는 소문자로 소문자는 대문자로 바꾸어 출력하는 함수를 구현하시오. • 사용자의 입력 문자열로부터 공백 또는 개행문자가 들어가지 않은 첫번째 단어만을 찾아서 출력하는 푸로그램을 구현하시오. • “오늘은 2005년 1월 1일 입니다”와 같은 형식으로 현재의 날짜를 출력하는 함수를 구현하시오. • 문자열 포인터의 배열을 알파벳 순서에 맞게 정렬하여 대문자 출력하는 함수를 구현하시오. 이때 정렬하는 것은 실제 문자열들의 위치를 바꾸는 것은 아니고 포인터를 정렬하도록 한다.

  15. Chapter11 구조체와 사용자정의

  16. 구조체란? 구조체란? • 하나 이상의 변수를 멤버로 갖는 새로운 자료형 • 모든 변수의 데이터 타입이 달라도 가능 • 포인터 변수나 배열도 멤버로 가능 구조체 정의 • 구조체의 구조를 알려주는 작업 • 컴퓨터로 하여금 데이터를 위한 공간이 할당되지 않는다. struct phone { //phone 이라는 이름(태그)의 구조체 선언 char name[20]; //첫번째 구조체 멤버 char phoneno[20]; //두번째 구조체 멤버 }

  17. 구조체 변수 구조체 변수의 선언 • C언어의 기본 자료형 처럼 미리 선언된 구조체의 이름으로 변수를 생성하는 것 • 데이터를 위한 공간이 할당된다. 구조체 변수의 초기화 • 배열을 초기화하는 방법과 유사한 구문을 사용하여 구조체 변수도 선언 시에 초기화할 수 있다. struct phone myphone; //앞에서 정의한 phone형식의 구조체 변수를 선언함 //따라서 myphone은 두개의 멤버 name과 phoneno를 갖게 되며 //myphone이 할당받는 데이터 공간은 총 40바이트가 될 것 struct phone myphone = { “Hong, Gil-Dong”, “02-111-1234” }; //myphone의 name멤버는 “Hong, Gil-Dong”으로, //phoneno의 멤버는 “02-111-1234”로 초기화되었다.

  18. 구조체 멤버로의 접근 멤버 연산자(.) • 구조체의 각 멤버에 접근하기 위해서는 멤버 연산자(.)을 이용한다. struct phone { char name[20]; char phoneno[20]; } myphone; puts(myphone.name); puts(myphone.phoneno);

  19. 구조체의 배열 구조체의 배열 • 다른 기본 자료형의 배열의 선언과 같은 방법으로 구조체의 배열이 선언된다. 구조체 배열의 멤버 접근 • 구조체 배열의 멤버도 구조체의 멤버에 접근 하던 것과 같은 방식으로 접근한다. struct phone { char name[20]; char phoneno[20]; }; struct phone phonelist[10]; //name과 phoneno를 멤버로 하는 phone형식의 구조체를 10개 가지는 배열 struct phone phonelist[10]; puts(phonelist[0].name); puts(phonelist[0].phoneno); //phonelist[0]이 phone형태이므로 위와 같은 접근이 당연하다.

  20. 구조체 포인터 구조체의 포인터 • 구조체를 가리키는 포인터 • 구조체를 가리키는 포인터를 함수로 넘김으로써 효과적으로 사용할 수 있다. • 배열의 이름은 배열의 주소를 가리키는 포인터이지만 구조체의 이름은 포인터가 아니다. 구조체 멤버의 접근 • 화살표연산자(->)를 사용한다. struct phone { char name[20]; char phoneno[20]; }; struct phone myphone = { "Hong, Gil-Dong", "02-111-1234" }; struct phone *ptr = &myphone; //구조체 phone을 가리키는 포인터 ptr을 선언하고, //ptr이 구조체 변수 myphone의 주소를 갖도록 하였다.

  21. 구조체 문자열 멤버(I) 문자의 배열로 선언 • 문자열이 구조체 안에 저장된다. 문자열을 가리키는 포인터로 선언 • 문자열은 따로 저장되고 구조체 안에는 포인터만 저장된다. • 포인터만 저장되므로 실제 문자열이 저장될 공간에 대해 명시적인 메모리 할당 및 해제가 반드시 요구된다. struct phone { char name[20]; char phoneno[20]; }; struct phone myphone = { "Hong, Gil-Dong", "02-111-1234" }; //이 경우 myphone은 총 40바이트의 공간 할당을 받는다. struct phone { char * name; char * phoneno; }; struct phone myphone = { "Hong, Gil-Dong", "02-111-1234" }; //이 경우 myphone은 총 8바이트의 공간 할당을 받는다.

  22. 구조체 문자열 멤버(II) 문자열을 가리키는 포인터로 선언(cont’d) • 문자열을 위한 공간 할당 및 해제는 다음의 함수 호출로 이루어진다. • malloc() : 주어진 크기만큼 동적으로 메모리를 할당하는 함수 • free() : 동적으로 할당된 메모리를 해제하는 함수 • malloc()과 free() 두 함수는 언제나 짝을 이루어 호출되어야 하며, free() 함수 호출이 제대로 이루어 지지 않으면 메모리의 낭비 및 부족 현상을 초래할 수 있다. #include <stdlib.h> void* malloc(size_t size); void free(void* ptr);

  23. 구조체의 중첩 구조체의 중첩 • 구조체를 포함하는구조체 • 한 구조체가 다른 구조체를 멤버로 하는 것 struct addr { char city[10]; char gu[10]; char dong[10]; char bungi[10]; }; struct phone { char name[20]; char phoneno[20]; struct addr address; };

  24. 함수의 매개변수로의 구조체(I) 함수의 매개변수로 구조체 전달 방법 • 구조체의 멤버 넘기기 • 구조체 변수 넘기기 • 구조체 포인터를 넘기기 구조체 멤버 넘기기 • 구조체의 멤버가 단일 값(기본 자료형)인 경우 그 데이터 타입을 인수로 하도록 함수를 선언한다. 구조체 변수 넘기기 • 함수 호출 시 함수 내부에 똑같이 생긴 구조체의 복사본이 생성되며 원본 구조체의 멤버들 값으로 복사본 멤버들이 초기화된다. • 원본 구조체에 직접 접근하는 것이 아니므로 데이터에 대한 안전이 보장된다. • 원본 구조체가 바뀌길 바란다면 같은 타입의 구조체가 반환 될 수 있도록 함수를 구현하여야 한다.

  25. 함수의 매개변수로의 구조체(II) 구조체 포인터 넘기기 • 구조체의 포인터를 통해 원본 주소가 전달되며, 함수 내부에서는 모두 원본 구조체를 직접 접근하여 사용한다. • 원본 구조체에 대한 안전이 보장되지 못한다. • 안전에 대한 보장이 필요한 경우 const 로 선언하는 것이 좋다.

  26. 구조체 비트 필드 비트 필드 • signed int 혹은 unsigned int 안에 인접한 비트들로서, 구조체 멤버를 비트 단위로 나눌 수 있다 • 구조체 선언에서 각 비트 필드에 레이블을 붙이고 크기를 지정한다. • 각 비트마다 가질 수 있는 값은 오직 0과 1뿐이다. • 이식성 부분에서 문제가 발생할 수 있어서 일반적으로는 특정 하드웨어 장치의 지정된 형식에 맞춰 데이터를 넣는 경우에 사용된다. struct { unsigned int bold : 1; // 1비트 : 0 or 1의 값만 갖는다. unsigned int italic : 1; // 1비트 : 0 or 1의 값만 갖는다. unsigned int size : 7; // 7비트 : 0 ~ 127 사이의 값을 갖는다. };

  27. 공용체 공용체(union)란? • 서로 다른 데이터 타입을 동일한 메모리 공간에 저장하는 데이터 타입 • 규칙적이지 않고 미리 알려지지 않은 여러 타입들을 담는 것 • 여러 타입들 중 어느 한 시점에 한 타입만 의미 있는 값을 갖는다. • 공용체 내의 여러 타입 중 현재 의미 있는 값을 가진 데이터 타입에 대한 추적은 프로그래머의 책임이다. • 멤버로의 접근 방법은 구조체와 똑같이 멤버연산자(.)를 사용한다. union MyType { int num1; double num2; char ch; } mytype; //mytype변수는 메모리에서 위의 세개의 데이터 타입중에서 가장 큰 타입인 double형의 공간만큼만 즉,8바이트만을 갖게된다. struct MyType { int num1; double num2; char ch; } mytype; //mytype변수는 메모리에서 4+8+1을 한 만큼의 공간(13바이트)를 갖게 된다.

  28. 열거형 열거형이란? • 정수형 상수를 표현하는 기호 이름을 선언하는 것 • 프로그램의 가독성을 향상시키기 위해 사용 열거형의 기본값 • 상수들은 기본적으로 0부터 시작하여 1씩 증가하는 정수를 갖는다. 값 대입하기 • 열거 목록의 상수에 특정 정수 값을 선택하여 지정할 수 있다. enum colors {RED, YELLOW, BLUE, GREEN}; //RED=0,YELLOW=1,BLUE=2,GREEN=3의 값을 갖는다. enum font {ARIAL, CENTURY=10, GOTHIC, TIMESROMAN=20}; // ARIAL=0,CENTURY=10,GOTHIC =11,TIMESROMAN=20의 값을 갖는다.

  29. typedef typedef란? • 이미 존재하는 자료형에 의미 있는 다른 이름을 부여하는 방법 • typedef 를 구조체에 사용했을 경우 구조체 정의에 구조체의 이름(태그)를 주지 않아도 된다. • 프로그램의 가독성이 좋아진다. typedef 와 #define의 차이 • #define는 전처리기에 의해서 해석되며, typedef는 컴파일러에 위해 수행된다. • #define은 타입과 값 모두에 대해 이름을 부여할 수 있지만, typedef는 타입에 대해서만 이름을 부여할 수 있다. typedef unsigned char BYTE; BYTE b, b[3], *pb; //b는 unsigned char형 변수 //b[3]는 unsigend char의 배열 //pb는 unsigned char를 가리키는 포인터

  30. 연습문제 • 복소수를 표현할 수 있는 구조체를 선언하고 복소수 두 개의 덧셈을 처리하여 반환하는 함수와 하나의 구조체를 받아서 출력하는 함수를 구현하시오. • 1번에서 정의한 복소수 구조체를 사용하여 복소수의 배열을 매개변수로 받아서 전체 합을 반환하는 함수를 구현하시오. • 학생의 이름, 학년(1-4), 국어점수, 영어점수, 수학점수, 그리고 평균을 가질 수 있는 구조체를 선언하고 사용자로부터 이름과 학년, 3과목의 점수를 입력 받는 함수와 구조체를 매개변수로 받아서 평균을 계산하여 저장하는 함수를 구현하시오. 이 때, 학생의 이름은 문자 20자리를 갖는 배열로 선언한다. • 3번에서 정의된 구조체를 사용하여 20명의 학생정보를 저장할 수 있는 배열을 선언하고 사용자로부터 정보를 입력 받는 함수와 학생의 이름으로 검색하여 학년, 3과목의 점수, 평균을 출력하여 주는 함수로 구성된 프로그램을 구현하시오. • 4번의 프로그램에서 구조체의 정의 중 학생이름을 문자열을 가리키는 포인터로 바꾸어서 재 작성하시오.

  31. Chapter12 파일 I/O

  32. 파일이란? 파일이란? • 디스크와 같은 저장 공간에 이름이 붙은 일부 영역 • 중간이 끊이지 않은 바이트의 연속물이며, 각 바이트는 개개로 읽혀지는 것 파일의 종류 • 텍스트 파일 • 2진(binary) 파일 표준 파일 • C프로그램에서 자동으로 열리며 각각의 파일(FILE*) 포인터로 지정하여 사용한다.

  33. 파일의 열기와 닫기(I) 파일 열기 • 파일와 데이터를 주고 받을 수 있는 스트림을 생성하는 것 • fopen()함수로 파일을 연다. • fopen() 함수는 파일이 성공적으로 열리면 해당하는 파일의 파일 포인터가 반환하고 파일열기에 실패하면 널 포인터를 반환한다. • 파일 열기 모드 : 파일을 열고 나서 하고자 하는 작업이 “읽기” 인지, 혹은 “쓰기”인지에 따라서 모드를 지정해주어야 한다. #include <stdio.h> FILE * fopen(const char* filename, const char* mode); //filename : 열고자 하는 파일이름 //mode : 파일에 대한 작업 모드

  34. 파일의 열기와 닫기(II) 파일 닫기 • 열린 파일에 대한 작업이 모두 끝나게 되면 닫아주어야 한다. • fclose() 함수로 파일을 닫는다. • fclose() 함수는 파일이 성공적으로 해당 파일 포인터가 가리키는 파일을 닫고, 필요에 따라서 버퍼를 플러시 한다. • fclose() 함수는 파일이 성공적으로 닫혀지면0을 반환하고, 오류가 발생하면 EOF를 반환한다. #include <stdio.h> int fclose(FILE *stream); //stream : 닫고자 하는 파일을 가리키는 파일 포인터

  35. 표준 입출력 함수 표준 입출력 함수 • 파일을 열어서 파일의 처음부터 끝까지 차례대로 접근하여 데이터를 읽거나 쓴다. 파일의 끝(EOF) • 파일의 읽기 작업은 파일의 끝에 도달했을 때 종료되어야 한다. • getc()의 파일의 끝 : EOF(-1) - fgets()의 파일의 끝 : NULL 포인터(0) • fscanf()의 파일의 끝 : EOF(-1)

  36. 임의접근(Random Access) 임의 접근을 위한 입출력 함수 • 파일을 열고 난 후 처음부터 끝까지 차례대로 읽는 것이 아니라 파일 내의 특정 바이트에 직접 접근한다. • 파일을 배열처럼 사용할 수 있다. fseek() • 파일의 특정 바이트에 접근하는 함수 • 세번째 매개변수 : 시작점 (파일 탐색을 시작할 지점) • 두번째 매개변수 : 시작점으로부터의 거리를 알려주는 값 ftell() • 현재의 파일 위치를 반환하는 함수 #include <stdio.h> int fseek(FILE * stream, long offset, int startpos); long ftell(FILE * stream);

  37. 기타 파일 입출력 함수 int ungetc(int c, FILE * fp) • c가 가리키는 문자를 입력 스트림으로 반납한다. int fflush(FILE *fp) • 버퍼 내부의 기록되지 않은 모든 데이터를 fp가 가리키는 파일로 출력한다. int setvbuf(FILE *fp, char *buf, int mode, size_t size) • 표준 입출력 함수가 사용할 버퍼를 직접 설정한다. int feof(FILE *fp) • 파일의 마지막에 도달했는지를 반환한다. • 파일의 끝인 경우에 0이 아닌 값을, 끝이 아닌 경우에는 0을 반환한다. int ferror(FILE *fp) • 파일로부터의 읽기 혹은 쓰기 오류가 발생했을 경우에 0이 아닌 값을 반환하고, 정상적인 진행이었을 경우에는 0을 반환한다.

  38. 2진 입출력 함수 2진 입출력 • 2진 형식 : 데이터가 파일에 저장될 때 프로그램이 이용하는 표현 방식과 동일한 방식을 이용하는 경우 • 텍스트 형식 : 데이터의 전부가 문자형식으로 데이터를 해석하여 저장하는 경우 fread() • 파일로부터 2진 형식으로 데이터를 읽어온다. fwrite() • 파일에 2진 형식으로 데이터를 쓴다. #include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp); size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp);

  39. 연습문제 • 친구들의 이름과 전화번호, 나이 정보를 갖는 구조체의 배열(최대 크기 100)을 선언하고, 사용자에게 메뉴를 보여주고 선택한 메뉴에 따라서 용도에 맞는 함수를 구현하여 수행되도록 하시오. [ 메뉴 : 1.친구정보입력 2.친구이름으로검색 3.파일로저장] (프로그램 시작 시 이미 파일에 입력되어있는 정보가 있다면 그 정보를 읽어서 배열로 만들고, 친구 정보가 새롭게 입력되면 배열의 마지막 요소 뒤로 정보가 저장되도록 한다. 그리고 파일로 저장메뉴가 선택되면 현재 배열의 모든 친구 정보를 기존 파일의 내용을 지운 후에 저장되도록 한다.) • 텍스트 파일에 여러 문장이 저장되어 있다. 이 파일을 읽어서 파일내에 있는 단어의 개수를 출력하는 프로그램을 구현하시오. • 텍스트 파일에 영어로 된 문장들이 저장되어 있다. 이 파일을 읽어서 각 알파벳이 몇번 등장하는지 개수를 출력하는 프로그램을 구현하시오. (이때, 알파벳(단일문자)과 개수(정수형)로 구성된 구조체를 52개 갖는 배열을 선언하여 구현하시오.) • 3번에서 사용한 파일을 열어서 대문자는 소문자로, 소문자는 대문자로 바꾸어 새로운 파일에 저장하는 프로그램을 구현하시오.

  40. Chapter13 메모리 관리

  41. 변수의 기억부류(Storage Class) 유효범위(Scope) • 어떤 변수에 접근할 수 있는 구역 혹은 프로그램의 구역 • 블록 범위 : 서로 짝이 되는 { 와 } 사이의 영역 내에서 유효한 범위 • 파일 범위 : 변수가 정의된 지점으로부터 그 파일의 끝까지 유효한 범위 연결성 • 외부 연결성 : 여러 파일로 구성된 프로그램의 어디서든 사용할 수 있는 것 • 내부 연결성 : 그 변수가 선언된 파일 안에서만 사용할 수 있는 것 • 연결성 없음 : 자신이 정의된 블록 내에서만 사용할 수 있는 것 저장기간 • 정적 저장 기간 : 변수가 프로그램이 실행되는 기간 내내 존재하는 것 • 자동 저장 기간 : 변수가 정의된 블록에 프로그램 제어권이 들어왔을 때부터 블록을 빠져나갈 때 까지 존재하는 것

  42. 자동 변수 자동 변수 • 선언위치 : 특정 블록 혹은 함수의 시작 부분에 선어한다. • 키워드 : auto • 유효범위와 연결성 : 변수가 정의된 블록에서만 그 변수에 접근할 수 있다. • 저장기간 : 자신이 선언된 블록이나 함수에 프로그램 제어권이 들어왔을 때 생성되고, 그 블록이나 함수가 종료되면 변수도 소멸된다. • 종류 : 블록이나 함수의 시작 위치에 선언된 모든 지역 변수, 형식 매개변수 자동 변수의 초기화 • 프로그래머가 명시적으로 초기화하지 않으면 자동으로 초기화되지 않는다. • 상수와 표현식(이미 알려진 변수들만 포함된 표현식)으로 초기화 가능하다.

  43. 레지스터 변수 레지스터 변수 • 경우에 따라 CPU레지스터와 같은 빠른 메모리에 저장되는 변수 • 선언위치, 유효범위와, 저장기간, 연결성 등과 같은 성질은 자동 변수와 같다. • 키워드 : register • 형식 매개 변수도 레지스터로 선언할 수 있다. • 레지스터 변수의 주소는 가져올 수 없다.

  44. 블록 범위 정적 변수 블럭 범위를 갖는 정적 변수 • 선언위치 : 자동 변수와 똑같이 블록 혹은 함수 시작부분에 선언한다. • 키워드 : static • 유효범위 : 자동 변수와 똑같이 변수가 선언된 블록 혹은 함수 내에서만 사용할 수 있다. • 저장기간 : 자신이 선언된 블록이나 함수에 프로그램 제어권이 들어왔을 때 생성되고, 그 블록이나 함수가 끝난 후에도 존재하게 되며, 프로그램이 완전히 종료될 때 소멸된다. • 함수의 형식 매개변수에 사용할 수 없다.

  45. 외부 연결 정적 변수(전역변수) 외부 연결 범위 정적 변수(전역 변수) • 선언위치 : 모든 함수의 외부에 선언한다. • 정의 선언 키워드 : 없다.참조 선언 키워드 extern • 유효범위 : 프로그램을 구성하는 모든 파일에서 사용한다. • 저장기간 : 프로그램 시작 시에 생성되고, 프로그램 종료 시에 소멸된다. 전역변수의 초기화 • 명시적인 초기화가 없으면 자동으로 0으로 초기화한다. • 변수 초기화 시에 상수만 사용할 수 있다.