8주차: Strings, Arrays and Pointers
Strings 문자열(String) “I am a boy.”, “String”, “”(Null string), ... NULL string은 비어 있는 string이라고 생각하면 된다. 문자열(string)은 문자(character)의 집합이다.
Strings in Memory “I am a boy.” ‘I’, ‘ ’, ‘a’ 등은 문자(char)이다. ‘\0’은 문자열의 끝을 나타내는 특수문자이다. 메모리의 어딘가에... ‘I’ ‘ ’ ‘a’ ‘m’ ‘b’ ‘o’ ‘y’ ‘.’ ‘\0’ 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
문자열과 배열(1/2) 문자열은 문자의 집합이므로 char의 배열(array)로 문자열을 나타낼 수 있다. char tmpstr[12]; tmpstr은 char 12개의 배열 변수이다. 따라서 tmpstr은 문자(char) 12개를 저장할 수 있다.
문자열과 배열(2/2) “I am a boy.”같은 문자열은 char array 변수 tmpstr에 저장될 수 있다. tmpstr[0] = ‘I’ tmpstr[1] = ‘ ’ ... tmpstr[10] = ‘.’ tmpstr[11] = ‘\0’ I am a boy. 11문자와 특수문자 ‘\0’까지 저장해야 하므로 12개의 원소를 가지는 배열이 필요하다.
Memory and Variables - 메모리의 어딘가에... a b 1000 1004 1008 1012 1016 #include<stdio.h> int main(void) { int a = 3, b = 4; printf(“%d %d\n”, a, b); return 0; } - 메모리의 어딘가에... a b 1000 1004 1008 1012 1016 -오른쪽 그림을 보면 메모리 1004번지에 a가 1008번지에 b가 자리잡고 있음을 알 수 있다. 1004번지에는 3, 1008번지에는 4라는 값이 들어 있을 것이다.
Pointers in C Pointer 변수는 메모리의 번지(주소)를 저장하는데 쓰이는 변수이다. 앞의 예제에서 보이는 1004, 1008같은 주소를 포인터 변수에 저장할 수 있다.
Pointer Variables 포인터 변수의 선언 일반 변수의 선언과 같으나 변수 앞에 *를 붙인다. int *p; char *p; 문자(char) 변수의 주소에 대한 포인터 변수 p의 선언 변수의 타입(int, char, float, ...)에 따라서 별개의 포인터 변수를 사용해야 한다. 정수변수의 주소를 저장하는 정수 포인터 변수(int *) 실수변수의 주소를 저장하는 실수 포인터 변수(float *)
Pointer Variables for Each Type 포인터 변수는 각 데이터 타입별로 있다. 정수포인터, 문자포인터, ... 각 데이터 타입의 크기가 다르기 때문에 데이터 타입의 크기에 따라서 메모리에서 차지하는 영역이 다르다.
Pointer Variable의 초기화 int *p, i; p = 0; p = NULL; p = &i; p = (int *) 1776; p에 정수상수 1776을 정수포인터로 변환한 값을 넣는다.
& Operator & 연산자는 변수의 주소(번지)를 돌려주는 연산자이다. scanf(“%d”, &p) &p: 변수 p의 주소이다. scanf(“%d”, &p) 이제 scanf 함수에서 &를 붙이는 이유를 알 수 있다. scanf의 인자는 control_string(위의 예에서는 “%d”)과 변수의 주소(&p) 인 것이다.
Type Casts Type cast 연산자 데이터 타입을 변환해 주는 연산자 (float) i <- 이런 식으로 사용된다(여기서 i는 int 변수라고 생각하자.). 그러면 위의 수식은 i의 값을 가지는 실수로 변환된다. 즉, i에 3이라는 값이 들어 있었으면 (float) i는 3.0의 값을 가지게 된다.
An Example without Type Casts #include<stdio.h> #define STUDENT_NUM 74 int main(void) { int sn = STUDENT_NUM; int total_score = 6750; float avg_score; avg_score = total_score / sn; printf(“Average score is %.2f\n”, avg_score); return 0; } -이 프로그램은 점수의 총합 6750을 학생수 74로 나누어 평균점수를 구하는 프로그램이다. -빨간 부분을 보면 =의 오른편은 정수수식이며 왼편은 실수변수이다. -total_score / sn은 정수수식으로 정수값만을 가질 수 있다. 따라서 이 수식의 값은 91이 된다. -91을 실수변수 avg_score에 할당할 때 91.0이 avg_score에 들어간다. 따라서 최종 결과로 91.00을 화면에 출력하게 된다.
A Type Cast Example #include<stdio.h> #define STUDENT_NUM 74 int main(void) { int sn = STUDENT_NUM; int total_score = 6750; float avg_score; avg_score = (float) total_score / (float) sn; printf(“Average score is %.2f\n”, avg_score); return 0; } -이 프로그램은 평균점수를 계산할 때 type cast를 한다. total_score를 실수로 타입변환하면 6750.0이 된다. sn을 실수로 변환하면 74.0이 된다. -이제 (float) total_score / (float) sn은 실수수식이며 6750.0 / 74.0 = 91.22...라는 값을 가진다. -이 프로그램은 91.22를 화면에 출력한다.
교재에서 강의와 연관된 부분 3장 3.11 6장 6.1, 6.2, 6.10