2 배열과 구조
학습목표 내용 포인터의 의미를 이해하고 구현 방법을 알아본다. 배열 자료형을 이해하고 배열의 구현 방법을 알아본다. 구조체 자료형을 이해하고 구조체의 구현 방법을 알아본다. 재귀호출의 의미를 이해하고 구현 방법을 알아본다. 내용 포인트 배열 구조체 재귀호출
1. 포인터 포인터 변수의 메모리 주소값 포인터변수 주소값을 저장하는 특별한 변수 포인터 변수가 어떤 변수의 주소를 저장하고 있다는 것은 포인터 변수가 그 변수를 가리키고 있다(포인트하고 있다)는 의미 포인터 변수를 이용하여, 연결된 주소의 변수 영역을 액세스 함 포인터변수를 간단히 포인터라고 함
1. 포인터 포인터 변수의 의미 편지봉투에 받는사람의 집주소를 쓰면, 그 주소로 편지가 전달되어 집주인 이 편지를 받게 된다. 편지봉투 ☞ 포인터변수 편지봉투에 쓰는 받는사람 주소 ☞ 포인터변수에 저장된 변수의 메모리 주소 주소에 해당하는 집주인이 편지를 받는 것 ☞ 포인터변수를 통한 변수의 액세스
1. 포인터 포인터 사용 예 int i; …………❶ int *ptr = &i; …❷ ❷에서 변수 i의 주소를 포인터변수 ptr에 저장하면 ptr에는 메모리 주소 150이 저장되 므로, 포인터변수 ptr은 150번지의 변수 i를 가리키는 상태가 됨
1. 포인터 포인터 선언 포인터 선언 형식 ❶자료형 ❷포인터변수이름 포인터변수 자체의 자료형이 아니라, 포인터변수에 저장할 주소에 있는 일반 변수의 자료형 ❷포인터변수이름 일반변수이름과 구별하여 변수이름 앞에 ‘*’를 표시하여 포인터변수임을 나타낸다.
1. 포인터 포인터 변수의 자료형에 따른 메모리 액세스 범위 char *ptr; ……❶ short *ptr;……❷ int *ptr; ……❸
1. 포인터 포인터 연산 주소 연산자 : & 변수의 주소를 구하기 위해 사용 변수 앞에 &를 사용하여 그 변수의 주소를 사용 사용할 주소 영역의 변수와 포인터변수는 같은 자료형으로 선언 주소 연산자 사용 예 int i=10; int *ptr; ptr = &i;
1. 포인터 참조 연산자 : * *포인터 변수 = 값 ; 저장된 주소에 있는 값(변수에 저장된 값)을 액세스하는 연산자 사용 방법1: 지정한 값을 포인터가 가리키고 있는 주소에 저장 사용 방법2: 포인터가 가리키는 주소에 있는 값을 변수에 저장 *포인터 변수 = 값 ; 변수 = *포인터 변수 ;
1. 포인터 참조 연산자 : * 참조 연산자 사용 예 int i, j; int *ptr; ptr = &i; ………❶ j = *ptr; ………❸
1. 포인터 [예제 3-8] : 포인터 연산자 사용 예 프로그램 실행 화면 > A
1. 포인터 [예제 3-8]의 실행 후 상태
1. 포인터 포인터의 초기화 포인터 초기화 방법 1 포인터 초기화 방법 2 주소연산자를 사용하여 변수의 주소 지정 예) int i; int *ptr = &i; 포인터 초기화 방법 2 동적 메모리를 할당하고 그 시작주소를 포인터 값으로 지정 예) char *ptr = (char *)malloc(100); 자료형 *포인터 변수 = 초기값 주소 ; 자료형 변수; 자료형 *포인터 변수 = 초기값 주소 ;
1. 포인터 포인터 초기화 방법 3 포인터 초기화 방법 4 포인터 초기화 방법 5 문자형 포인터에 문자열의 시작주소를 지정 예) char *ptr = "korea"; 포인터 초기화 방법 4 배열의 이름을 이용하여 배열시작주소를 지정 배열 이름은 문자열과 마찬가지로 그 시작주소를 전달할 수 있음 예) char A[100]; char *ptr = A; 포인터 초기화 방법 5 배열요소의 주소를 사용하여 지정 이런 경우에 인덱스로 표시하는 배열의 각 요소는 그 이름만으로 주소를 전달할 수 없기 때문에 주소연산자 &를 사용 예) char A[100]; char *ptr = &A[0];
2. 배열 배열(array) 같은 자료형을 가진 자료들을 나열하여 메모리에 연속으로 저장하여 만든 자료들의 그룹 같은 자료형을 가진 자료들을 나열하여 메모리에 연속으로 저장하여 만든 자료들의 그룹 인덱스(index) 배열의 요소를 간단히 구별하기 위해 사용하는 번호 C에서 인덱스는 항상 0부터 시작 모든 자료형에 대해서 배열로 구성 가능 구성 형태에 따라 1차원 배열, 2차원 배열, 3차원 배열, …
2. 배열 1차원 배열 1차원 배열 선언 형식 ❶자료형 ❷배열이름 ❸배열요소의 개수 배열의 자료형을 선언. 배열 요소들은 모두 같은 자료형이어야 하고, 그 자료형이 배열의 자료형이 됨 ❷배열이름 일반 변수와 같은 규칙으로 배열의 이름을 선언 ❸배열요소의 개수 배열요소의 개수는 배열의 크기를 의미 배열을 선언하면 메모리에 배열에 대한 공간 할당 할당 크기 : (자료형에 대한 메모리 할당 크기✕배열요소의 개수)
2. 배열 배열 선언에 따른 메모리 할당 크기
2. 배열 배열 선언에 따른 메모리 할당 크기 [예제 3-1] 프로그램 자료형에 따른 메모리 할당 크기 확인하기 실행 결과
2. 배열 1차원 배열의 초기화 배열의 선언과 함께 초기 값을 설정하는 작업 1차원 배열의 초기화 형식 초기화 형식과 의미
2. 배열 초기화 형식과 의미
2. 배열 초기화 형식과 의미
2. 배열 문자 배열 문자의 나열. “와 ”사이에 표시 문자열을 저장하기 위해서는 문자열을 구성하는 문자들을 연속적으로 저장해야 하기 때문에 char형 배열을 사용 배열의 자료형은 문자자료형(char)
2. 배열 문자 배열의 초기화 문자열을 그대로 지정하거나 초기값 문자리스트를 사용 문자배열을 문자열 “String” 으로 초기화하는 예 S1 : 문자열을 사용한 초기화 char s1[10] = “String” ; S2 : 초기값 문자리스트를 사용한 초기화 char s2[10] = { ‘S’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’} ;
2. 배열 다차원 배열 다차원 배열의 선언 배열의 차수 만큼 [배열크기] 항목을 추가 2차원 배열의 선언 형식 2차원 이상의 배열 다차원 배열의 선언 배열의 차수 만큼 [배열크기] 항목을 추가 2차원 배열의 선언 형식 ❶ 배열 크기 : 행의 개수. 행 인덱스 크기 ❷ 배열 크기 : 열의 개수. 열 인덱스 크기
2. 배열 2차원 배열 선언에 대한 논리적 구조와 물리적 구조 int i[2][3];
2. 배열 3차원 배열의 선언 형식 ❶ 배열 크기 : 면의 개수. 면 인덱스 크기 ❷ 배열 크기 : 행의 개수. 행 인덱스 크기 ❸ 배열 크기 : 열의 개수. 열 인덱스 크기
2. 배열 3차원 배열 선언에 대한 논리적 구조와 물리적 구조 int i[2][3][4];
2. 배열 다차원 배열의 초기화 2차원 배열의 초기화 초기값의 지정형태는 다차원 배열이 배열의 배열이라는 것을 생각하여 초 기값을 구분하여 지정하거나, 1차원 배열처럼 초기값 리스트를 지정하여 순 서대로 배열요소의 초기값으로 설정 2차원 배열의 초기화 예 int i[2][3] = {{1,2,3}, {4,5,6}} ; int i[2][3] = {1,2,3,4,5,6} ; int i[][3] = {{1,2,3}, {4,5,6}} ;
2. 배열 3차원 배열의 초기화 3차원 배열의 초기화 예 int i[2][3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9,10,11,12}, {13,14,15,16}, {17,18,19,20}, {21,22,23,24} };
2. 배열 문자 다차원 배열 char c[3][20]= { "Hong Gil Dong", "Computer Department", "Seoul, Korea" };
2. 배열 포인터와 문자 배열 포인터를 사용하여 문자열 연산 처리 [예제 3-9] : 포인터를 이용한 문자열 처리 프로그램 ptr1 = string1;
2. 배열 [예제 3-9] : 포인터를 이용한 문자열 처리 프로그램 ptr1+7과 &string[7]의 관계
2. 배열 [예제 3-9] : 포인터를 이용한 문자열 처리 프로그램 ptr2 = &string1[7];
2. 배열 [예제 3-9] : 포인터를 이용한 문자열 처리 프로그램 for(i=16; i>=0; i--){ putchar(*(ptr1+i)); } for 반복문을 사용하여 문자열을 거꾸로 출력
2. 배열 [예제 3-9] : 포인터를 이용한 문자열 처리 프로그램 포인터를 사용한 문자열 복사 포인터를 사용하여 string1의 문자열 변경
2. 배열 [예제 3-9] : 포인터를 이용한 문자열 처리 프로그램 예제 3-9의 실행 결과 >
2. 배열 포인터 배열 포인터 자료형을 배열로 구성 포인터 배열의 선언형식 자료형 *포인터배열이름 [배열크기] ; 여러 개의 포인터를 하나의 배열로 구성한 배열의 특징과 포인터의 특징을 모두 활용할 수 있다. 포인터 배열의 선언형식 포인터 배열에서 각 배열요소는 포인터 2차원 문자배열을 1차원 포인터배열로 표현 2차원 배열의 행의 개수 : 포인터배열의 크기 포인터배열의 각 배열요소 : 각 문자열에 대한 시작주소를 가진 포인터 자료형 *포인터배열이름 [배열크기] ;
2. 배열 2차원 배열과 1차원 포인터배열
2. 배열 예제 3-10 : 포인터 배열을 이용한 문자열 저장 프로그램 실행 결과 >
3. 구조체 구조체 구조체도 배열처럼 여러 개의 데이터를 그룹으로 묶어서 하나의 자료 형으로 정의하고 사용하는 자료형 배열은 같은 자료형 만을 그룹으로 묶을 수 있지만, 구조체는 서로 다른 자료형을 그룹으로 묶을 수 있으므로 복잡한 자료 형태를 정의하는데 유용하게 사용됨 레코드(record) 자료를 체계적으로 관리하기 위해서 구성한 일정한 단위 형식으로 필드(field) 레코드를 구성하는 하위 항목 파일(file) 여러 레코드가 모여서 하나의 파일을 구성 여러 자료형의 필드를 가지고 있는 레코드를 만들 때 구조체 사용함
3. 구조체 필드와 레코드, 파일의 관계
3. 구조체 구조체 선언 여러 자료형의 변수들을 그룹으로 묶어서 하나의 자료형으로 선언 구조체이름, 자료형, 데이터 항목으로 구성 구조체의 이름 - 구조체로 정의하는 새로운 자료형의 이름 항목 - 구조체를 구성하는 내부 변수들의 이름 구조체의 항목은 배열의 각 배열요소에 해당 배열요소는 모두 같은 자료형으로 되어있으므로 배열요소에 대한 선언 없이 사용이 가능하지만, 구조체에서는 각 항목이 다른 자료형을 가질 수 있기 때문에 항목별로 자료형과 항목이름(변수이름)을 선언해야 한다.
3. 구조체 구조체 선언은 사용할 구조체의 모양을 정의한 것뿐이므로 사용할 구조체 변수를 다시 선언해야 한다. 구조체 선언은 사용할 구조체의 모양을 정의한 것뿐이므로 사용할 구조체 변수를 다시 선언해야 한다. 선언된 구조체 변수는 일반변수와 똑같이 취급하고 사용
3. 구조체 구조체 사용 예) 직원 관리 구조체 구조체 선언 구조체 employee의 구조
3. 구조체 구조체 사용 예) 직원 관리 구조체 구조체 변수 선언 struct employee Lee, Kim, Park;
3. 구조체 구조체 사용 예) 직원 관리 구조체 구조체 변수의 선언 유형
3. 구조체 구조체의 초기화 구조체 변수 선언 시에 각 데이터 항목에 대한 값을 중괄호 안에 나열
3. 구조체 구조체 데이터 항목의 참조 구조체 변수에 있는 각 데이터 항목을 참조하기 위해서 구조체 연산자 사용
3. 구조체 점 연산자 : . 구조체 변수에 있는 데이터 항목을 개별적으로 지정할 때 사용 예)
3. 구조체 화살표 연산자 : -> 구조체 포인터 변수에서 포인터가 가리키는 구조체 변수의 데이터항목을 지정하기 위해서 화살표 연산자 사용 예)
3. 구조체 구조체의 연산 데이터 항목 참조 연산 구조체 복사 연산 점연산자와 화살표연산자를 이용하여 구조체의 데이터 항목을 개별적으로 참조 예) struct employee Lee; struct employee *Sptr; Sptr = &Lee; Lee.year = 2005; Sptr -> pay = 3000; Sptr -> name = “Ann”; 구조체 복사 연산 예) struct employee Lee, Kim, team[5]; Lee = Kim; Lee = team[2]; team[2] = team[3];
3. 구조체 구조체 변수의 주소 구하기 연산 예) struct employee Lee, team[5]; 포인터의 주소연산자를 사용하여 구조체 변수의 주소를 구하거나, 구조체 변수가 배열인 경우에는 배열의 특성에 따라 구조체 배열 변수의 이름에서 주소를 구할 수 있다. 예) struct employee Lee, team[5]; struct employee *Sptr1, *Sptr2; Sptr1 = &Lee; Sptr2 = team;
4. 재귀호출 재귀호출(순환호출) 자기 자신을 호출하여 순환 수행되는 것 함수에서 실행해야 하는 작업의 특성에 따라 일반적인 호출방식보다 재귀호출방식을 사용하여 함수를 만들면 프로그램의 크기를 줄이고 간단하게 작성 재귀 호출의 예) factorial n에 대한 factorial : 1부터 n까지의 모든 자연수를 곱하여 구하는 연산 n! = n x (n-1)! (n-1)! = (n-1) x (n-2)! (n-2)! = (n-2) x (n-3)! … 2! = 2 x 1! 1! = 1 마지막에 구한 하위 값을 이용하여 상위 값을 구하는 작업을 반복
4. 재귀호출 factorial 함수에서 n=4 인 경우의 실행
4. 재귀호출 예제 3-14 : 재귀 호출을 이용한 factorial 프로그램 실행 화면 >