Chapter 03 배열, 구조체, 포인터.

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

구조체 : Structure 와 포인터 2. 집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name.
제 3 장 변수와 자료형.
컴퓨터 개론 및 실습 강의 9.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
배열, 포인터 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
CHAP 1:자료구조와 알고리즘.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
제 8 장  파서 생성기 YACC 사용하기.
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
제 2 장 배열과 스트링.
제2장 배열과구조.
시스템 생명 주기(System Life Cycle)(1/2)
8. 객체와 클래스 (기본).
Internet Computing KUT Youn-Hee Han
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
시스템 생명 주기(System Life Cycle)(1/2)
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
자료 구조: Chapter 3 배열(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료 구조: Chapter 3 배열(1) 순천향대학교 컴퓨터공학과 하 상 호.
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
연결리스트 (Linked List) 충북대학교 컴퓨터공학과 서 영 훈.
자료 구조: Chapter 3 (2)구조체, 포인터
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
CHAP 3:배열, 구조체, 포인터.
제 4 장 L i s t.
스택(stack) SANGJI University Kwangman Ko
제 3 장. 배열과 구조체 및 포인터.
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
head data link data link data link NULL a b c
자료 구조: Chapter 3 (2)구조체, 포인터
8장 포인터.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
25장. 메모리 관리와 동적 할당.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
[INA240] Data Structures and Practice
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
Dynamic Memory and Linked List
Chapter 2:: Array, Structure, and Pointer
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
CHAP 1:자료구조와 알고리즘 C로 쉽게 풀어쓴 자료구조 생능출판사 Slide 1 (of 28)
자료구조: CHAP 4 리스트 (1) 순천향대학교 컴퓨터공학과 하 상 호.
14주차.
제 3 장 상수와 변수
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
* 프로그램을 간단히 하기 위해 malloc 성공체크는 안 함
Chapter 04 리스트.
Chapter 01 자료 구조와 알고리즘.
4장 - PHP의 표현식과 흐름 제어-.
자료구조: CHAP 4 리스트 (2) 순천향대학교 컴퓨터공학과 하 상 호.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
4장 자료형.
C 프로그래밍 기초.
자료구조 (Data Structure).
토론을 위한 질문 배열의 이름에는 무엇이 저장되는가? C언어에서 배열 추상데이터의 store는 어떻게 구현 되는가?
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
제 8 장 포인터.
Chapter 07 트리.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
Presentation transcript:

Chapter 03 배열, 구조체, 포인터

Contents 3. 1 배열 3. 2 배열의 응용: 다항식 3. 3 배열의 응용: 희소 행렬 3. 4 구조체 3. 5 포인터 3. 1 배열 3. 2 배열의 응용: 다항식 3. 3 배열의 응용: 희소 행렬 3. 4 구조체 3. 5 포인터 3. 6 동적 메모리 할당

3. 1 배열 배열 배열 ADT 같은 형의 변수를 여러 개 만드는 경우에 사용 3. 1 배열 배열 같은 형의 변수를 여러 개 만드는 경우에 사용 int A0, A1, A2, A3, …,A9; → int A[10]; 반복 코드 등에서 배열을 사용하면 효율적인 프로그래밍이 가능 배열 ADT 배열 : <인덱스, 요소> 쌍의 집합 인덱스가 주어지면 해당되는 요소가 대응되는 구조 배열 ADT 객체: <인덱스, 요소> 쌍의 집합 연산:   ▪ create(n) ::= n개의 요소를 가진 배열의 생성.  ▪ retrieve(A, i) ::= 배열 A의 i번째 요소 반환.  ▪ store(A, i, item) ::= 배열 A의 i번째 위치에 item 저장.

3. 1 배열 1차원 배열 int A[6]; 2차원 배열 int A[3][4];

3. 2 배열의 응용 : 다항식 다항식의 일반적인 형태 다항식 표현 방법 #1 식 ; 배열을 사용한 2가지 방법 3. 2 배열의 응용 : 다항식 다항식의 일반적인 형태 식 ; 배열을 사용한 2가지 방법 다항식의 모든 항을 배열에 저장 다항식의 0이 아닌 항만을 배열에 저장 다항식 표현 방법 #1 모든 차수에 대한 계수값을 배열로 저장 하나의 다항식을 하나의 배열로 표현 typedef struct { int degree; float coef[MAX_DEGREE]; } polynomial; polynomial a = { 5, {10, 0, 0, 0, 6, 3} };

3. 2 배열의 응용 : 다항식 다항식 표현 방법 #1 (Cont.) 장점 : 다항식의 각종 연산이 간단해짐 3. 2 배열의 응용 : 다항식 다항식 표현 방법 #1 (Cont.) 장점 : 다항식의 각종 연산이 간단해짐 단점 : 대부분의 항의 계수가 0이면 공간의 낭비가 심함. 예) 다항식의 덧셈 연산 while( Apos<=A.degree && Bpos<=B.degree ){ if( degree_a > degree_b ){ // A항 > B항 C.coef[Cpos++]= A.coef[Apos++]; degree_a--; } else if( degree_a == degree_b ){ // A항 == B항 C.coef[Cpos++]=A.coef[Apos++]+B.coef[Bpos++]; degree_a--; degree_b--; else { // B항 > A항 C.coef[Cpos++]= B.coef[Bpos++]; degree_b--;

3. 2 배열의 응용 : 다항식 다항식 표현 방법 #2 (Cont.) 다항식에서 0이 아닌 항만을 배열에 저장 3. 2 배열의 응용 : 다항식 다항식 표현 방법 #2 (Cont.) 다항식에서 0이 아닌 항만을 배열에 저장 (계수, 차수) 형식으로 배열에 저장 예) 10x5+6x+3 -> ((10,5), (6,1), (3,0)) 하나의 배열로 여러 개의 다항식을 나타낼 수 있음 struct { float coef; int expon; } terms[MAX_TERMS]={ {10,5}, {6,1}, {3,0} };

3. 2 배열의 응용 : 다항식 다항식 표현 방법 #2 (Cont.) 장점: 메모리 공간의 효율적인 이용 3. 2 배열의 응용 : 다항식 다항식 표현 방법 #2 (Cont.) 장점: 메모리 공간의 효율적인 이용 단점: 다항식의 연산들이 복잡해진다(프로그램 3.3 참조). 예) 다항식의 덧셈 A=8x3+7x+1, B=10x3+3x2+1, C=A+B

3. 2 배열의 응용 : 다항식 다항식 표현 방법 #2 (Cont.) // C = A + B 3. 2 배열의 응용 : 다항식 다항식 표현 방법 #2 (Cont.) // C = A + B void poly_add2(int As, int Ae, int Bs, int Be, int *Cs, int *Ce) { float tempcoef; *Cs = avail; while( As <= Ae && Bs <= Be ) switch(compare(terms[As].expon,terms[Bs].expon)){ case '>': // A의 차수 > B의 차수 attach(terms[As].coef, terms[As].expon); As++; break; case '=': // A의 차수 == B의 차수 tempcoef = terms[As].coef + terms[Bs].coef; if( tempcoef ) attach(tempcoef,terms[As].expon); As++; Bs++; break; case '<': // A의 차수 < B의 차수 attach(terms[Bs].coef, terms[Bs].expon); Bs++; break; } // A의 나머지 항들을 이동함 for(;As<=Ae;As++) // B의 나머지 항들을 이동함 for(;Bs<=Be;Bs++) *Ce = avail -1;

3. 3 배열의 응용 : 희소 행렬 희소 행렬 배열을 이용하여 행렬(matrix)를 표현하는 2가지 방법 3. 3 배열의 응용 : 희소 행렬 희소 행렬 배열을 이용하여 행렬(matrix)를 표현하는 2가지 방법 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법 0이 아닌 요소들만 저장하는 방법 희소행렬 : 대부분의 항들이 0인 배열

3. 3 배열의 응용 : 희소 행렬 희소 행렬 표현 방법 #1 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법 3. 3 배열의 응용 : 희소 행렬 희소 행렬 표현 방법 #1 2차원 배열을 이용하여 배열의 전체 요소를 저장하는 방법 장점 : 행렬의 연산들을 간단하게 구현할 수 있음 단점 : 대부분의 항들이 0인 희소 행렬의 경우 많은 메모리 공간 낭비

3. 3 배열의 응용 : 희소 행렬 희소 행렬 표현 방법 #2 0 이 아닌 요소들만 저장하는 방법 3. 3 배열의 응용 : 희소 행렬 희소 행렬 표현 방법 #2 0 이 아닌 요소들만 저장하는 방법 장점 : 희소 행렬의 경우, 메모리 공간의 절약 단점 : 각종 행렬 연산들의 구현이 복잡해진다.

3. 4 구조체 구조체 (Structure) 구조체(structure) : 타입이 다른 데이터를 하나로 묶는 방법 3. 4 구조체 구조체 (Structure) 구조체(structure) : 타입이 다른 데이터를 하나로 묶는 방법 배열(array) : 타입이 같은 데이터들을 하나로 묶는 방법 char carray[100]; struct example { char cfield; int ifield; float ffield; double dfield; }; struct example s1;

3. 4 구조체 구조체 사용 예 구조체의 선언과 구조체 변수의 생성 typedef을 이용한 구조체의 선언과 구조체 변수의 생성 3. 4 구조체 구조체 사용 예 구조체의 선언과 구조체 변수의 생성 typedef을 이용한 구조체의 선언과 구조체 변수의 생성 struct person { char name[10]; // 문자배열로 된 이름 int age; // 나이를 나타내는 정수값 float height; // 키를 나타내는 실수값 }; struct person a; // 구조체 변수 선언 typedef struct person { char name[10]; // 문자배열로 된 이름 int age; // 나이를 나타내는 정수값 float height; // 키를 나타내는 실수값 } person; person a; // 구조체 변수 선언

3. 4 구조체 구조체의 대입과 비교 연산 구조체 변수의 대입 : 가능 구조체 변수끼리의 비교 : 불가능 3. 4 구조체 구조체의 대입과 비교 연산 구조체 변수의 대입 : 가능 구조체 변수끼리의 비교 : 불가능 struct person { char name[10]; // 문자배열로 된 이름 int age; // 나이를 나타내는 정수값 float height; // 키를 나타내는 실수값 }; main() { person a, b; b = a; // 가능 } main() { if( a > b ) printf("a가 b보다 나이가 많음"); // 불가능 }

3. 4 구조체 자체 참조 구조체 (Self-referential structure) 3. 4 구조체 자체 참조 구조체 (Self-referential structure) 필드중에 자기 자신을 가리키는 포인터가 한 개 이상 존재하는 구조체 연결 리스트나 트리에 많이 등장 typedef struct ListNode { char data[10]; struct ListNode *link; } ListNode;

3. 5 포인터 포인터 (Pointer) 다른 변수의 주소를 가지고 있는 변수 3. 5 포인터 포인터 (Pointer) 다른 변수의 주소를 가지고 있는 변수 포인터가 가리키는 내용의 변경 : * 연산자 사용 char a='A'; char *p; p = &a; *p= 'B';

3. 5 포인터 포인터와 관련된 연산자 & 연산자 : 변수의 주소를 추출 * 연산자 : 포인터가 가리키는 곳의 내용을 추출 3. 5 포인터 포인터와 관련된 연산자 & 연산자 : 변수의 주소를 추출 * 연산자 : 포인터가 가리키는 곳의 내용을 추출 p // 포인터 *p // 포인터가 가리키는 값 *p++ // 포인터가 가리키는 값을 가져온 다음, 포인터를 한칸 증가한다. *p-- // 포인터가 가리키는 값을 가져온 다음, 포인터를 한칸 감소한다. (*p)++ // 포인터가 가리키는 값을 증가시킨다. int a; // 정수 변수 선언 int *p; // 정수 포인터 선언 int **pp; // 정수 포인터의 포인터 선언 p = &a; // 변수 a와 포인터 p를 연결 pp = &p; // 포인터 p와 포인터의 포인터 pp를 연결

3. 5 포인터 다양한 포인터 포인터의 종류 포인터의 형변환 void *p; // p는 아무것도 가리키지 않는 포인터 3. 5 포인터 다양한 포인터 포인터의 종류 포인터의 형변환 void *p; // p는 아무것도 가리키지 않는 포인터 int *pi; // pi는 정수 변수를 가리키는 포인터 float *pf; // pf는 실수 변수를 가리키는 포인터 char *pc; // pc는 문자 변수를 가리키는 포인터 int **pp; // pp는 포인터를 가리키는 포인터 struct test *ps; // ps는 test 타입의 구조체를 가리키는 포인터 void (*f)(int) ; // f는 함수를 가리키는 포인터 void *p; pi=(int *) p;

3. 5 포인터 함수의 파라미터로서의 포인터 함수안에서 파라미터로 전달된 포인터를 이용하여 외부 변수의 값 변경 가능 3. 5 포인터 함수의 파라미터로서의 포인터 함수안에서 파라미터로 전달된 포인터를 이용하여 외부 변수의 값 변경 가능 void swap(int *px, int *py) { int tmp; tmp = *px; *px = *py; *py = tmp; } main() int a=1,b=2; printf("swap을 호출하기 전: a=%d, b=%d\n", a,b); swap(&a, &b); printf("swap을 호출한 다음: a=%d, b=%d\n", a,b);

3. 5 포인터 배열과 포인터 배열의 이름 : 사실상의 포인터와 같은 역할 컴파일러가 배열의 이름을 배열의 첫번째 주소로 대치

3. 5 포인터 구조체의 포인터 포인터의 포인터 구조체의 요소에 접근하는 연산자 : -> main() { struct { 3. 5 포인터 구조체의 포인터 구조체의 요소에 접근하는 연산자 : -> 포인터의 포인터 main() { struct { int i; float f; } s, *ps; ps = &s; ps->i = 2; ps->f = 3.14; } int a; // 정수 변수 변수 선언 int *p; // 정수 포인터 선언 int **pp; // 정수 포인터의 포인터 선언 p = &a; // 변수 a와 포인터 p를 연결 pp = &p; // 포인터 p와 포인터의 포인터 pp를 연결

3. 5 포인터 포인터 연산 포인터에 대한 사칙연산 : 포인터가 가리키는 객체단위로 계산 p // 포인터 3. 5 포인터 포인터 연산 포인터에 대한 사칙연산 : 포인터가 가리키는 객체단위로 계산 p // 포인터 p+1 // 포인터 p가 가리키는 객체의 바로 뒤 객체 p-1 // 포인터 p가 가리키는 객체의 바로 앞 객체

3. 5 포인터 포인터 사용시 주의사항 포인터가 아무것도 가리키고 있지 않을 때는 NULL로 설정 3. 5 포인터 포인터 사용시 주의사항 포인터가 아무것도 가리키고 있지 않을 때는 NULL로 설정 int *pi=NULL; 초기화가 안된 상태에서 사용 금지 포인터 타입간의 변환시에는 명시적인 타입 변환 사용 main() { char *pc; // 포인터 pi는 초기화가 안되어 있음 *pc = 'E’; // 위험한 코드 } int *pi; float *pf; pf = (float *)pi;

3. 6 동적 메모리 할당 프로그램이 메모리를 할당 받는 방법 정적 메모리 할당 정적 메모리 동적 메모리 할당 3. 6 동적 메모리 할당 프로그램이 메모리를 할당 받는 방법 정적 메모리 동적 메모리 할당 정적 메모리 할당 메모리의 크기는 프로그램이 시작하기 전에 결정 프로그램의 수행 도중에 그 크기가 변경될 수는 없음 만약 처음에 결정된 크기보다 더 큰 입력이 들어온다면 처리하지 못할 것이고 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비 예) 변수나 배열의 선언 int buffer[100]; char name[] = “data structure"; 프로그램의 실행 도중에 메모리를 할당 받는 것 필요한 만큼만 할당을 받고 또 필요한 때에 사용하고 반납 메모리를 매우 효율적으로 사용가능

3. 6 동적 메모리 할당 동적 메모리 할당 전형적인 동적 메모리 할당 코드 동적 메모리 할당 관련 라이브러리 함수 3. 6 동적 메모리 할당 동적 메모리 할당 전형적인 동적 메모리 할당 코드 동적 메모리 할당 관련 라이브러리 함수 malloc(size) // 메모리 할당 free(ptr) // 메모리 할당 해제 sizeof(var) // 변수나 타입의 크기 반환(바이트 단위) main() { int *pi; pi = (int *)malloc(sizeof(int)); // 동적 메모리 할당 ... // 동적 메모리 사용 ... free(pi); // 동적 메모리 반납 }

3. 6 동적 메모리 할당 동적 메모리 할당 라이브러리 malloc(int size) free(void ptr) 3. 6 동적 메모리 할당 동적 메모리 할당 라이브러리 malloc(int size) size 바이트 만큼의 메모리 블록을 할당 free(void ptr) ptr이 가리키는 할당된 메모리 블록을 해제 sizeof 키워드 변수나 타입의 크기 반환 (바이트 단위) (char *)malloc(100) ; /* 100 바이트로 50개의 정수를 저장 */ (int *)malloc(sizeof(int));/* 정수 1개를 저장할 메모리 확보*/ (struct Book *)malloc(sizeof(struct Book))/* 하나의 구조체 생성 */ size_t i = sizeof( int ); // 4 struct AlignDepends { char c; int i; }; size_t size = sizeof(struct AlignDepends); // 8 int array[] = { 1, 2, 3, 4, 5 }; size_t sizearr = sizeof( array ) / sizeof( array[0] ); // 20/4=5

3. 6 동적 메모리 할당 동적 메모리 할당 예 struct Example { int number; char name[10]; 3. 6 동적 메모리 할당 동적 메모리 할당 예 struct Example { int number; char name[10]; }; void main() { struct Example *p; p=(struct Example *)malloc(2*sizeof(struct Example)); if(p==NULL){ fprintf(stderr, "can't allocate memory\n") ; exit(1) ; } p->number=1; strcpy(p->name,"Park"); (p+1)->number=2; strcpy((p+1)->name,"Kim"); free(p);

[ Exercises ] Chapter 03 (page. 95) 26 배열과 포인터 27 구조체 정의 및 동적 메모리 할당