구조체 : Structure 와 포인터 2. 집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name.

Slides:



Advertisements
Similar presentations
11 주차 : Structures and Unions. 2 Introduction structure 는 다른 타입들의 변수를 모은 타입이며 그 타입들을 structure 의 멤버 라 한다. union 은 다른 타입의 여러 변수들을 하나 의 기억 장소에 보관함으로써 한.
Advertisements

Computer Network Lab. Keimyung University
제 3 장 변수와 자료형.
컴퓨터 개론 및 실습 강의 9.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
2016 ITA 1월 강의 C Programming -4일차- 포인터배열 및 이중포인터 정대진 ( )
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
Part 10 포인터 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
제 2 장 배열과 스트링.
Department of Computer Engineering
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Department of Computer Engineering
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
Chapter 03 배열, 구조체, 포인터.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
C언어: 배열 (Arrays).
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
CHAP 3:배열, 구조체, 포인터.
제 3 장. 배열과 구조체 및 포인터.
head data link data link data link NULL a b c
자료 구조: Chapter 3 (2)구조체, 포인터
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Department of Computer Engineering
25장. 메모리 관리와 동적 할당.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
Department of Computer Engineering
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
제 2 장 변수와 상수.
Department of Computer Engineering
프로그래밍실습 제 16 강.
제 3 장 상수와 변수
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
5장. 상수와 기본 자료형. 5장. 상수와 기본 자료형 5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 int val; "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
Chapter 10 함수 기본.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
Chapter 4 변수 및 바인딩.
2 배열과 구조.
-Part2- 제1장 1차원 배열이란 무엇인가.
Department of Computer Engineering
adopted from KNK C Programming : A Modern Approach
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
토론을 위한 질문 배열의 이름에는 무엇이 저장되는가? C언어에서 배열 추상데이터의 store는 어떻게 구현 되는가?
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
제5장 디버깅과 추적 문봉근.
9주차: Using Files and Others
박성진 컴퓨터 프로그래밍 기초 [03] 변수와 자료형 박성진
argc, argv 의 사용방법 #include <stdio.h>
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
printf("Global Korea\n");
Presentation transcript:

구조체 : Structure 와 포인터 2

집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name opt { { member_declaration} 1+ } tag_name ::= identifier member_declaration ::= type_specifier declaration_list ; declaration_list ::= declarator {, declarator } 0+ struct card { int pips; char suit; }; struct card { int pips; char suit; } c1, c2; struct card c1, c2; c1.pips = 3; c1.suits = ‘s’; c2 = c1;

typedef 구문 별명을 정하여 형정의를 할 수 있음 typedef struct card { int pips; char suit; } card; typedef struct card card; typedef int INTEGER; INTEGER a; card c1, c2;

구조체의 함수에 적용 (1) typedef struct employee_data { char name[25]; int employee_id; struct dept department; struct home_address *a_ptr; double salary; … } employee_data; employee_data update(employee_data e) { … e.department.dept_no = n; … return e; } employee_data e1; e1 = update(e1); 함수 호출 절차 (call-by-value) 1. 호출시에, e1 을 e 에 복사 2. 리턴시에, e 를 e1 으로 복사 구조체의 복사시 memberwise copy 문제점 : 구조체의 메모리 요구량이 큰 경우, 복사에 따른 부하 가 커진다.

구조체의 함수에 적용 (2) void update(employee_data *p) { … p->department.dept_no = n; (p->department).dept_no = n; (*p).dept_no = n; … return e; } employee_data e1; update(&e1); 이 경우, 함수 호출에 따른 오버헤드는 포인터 변수 복사. 구조체에 대한 포인터 변수 사용시, 구 조체의 내용을 접근하는 연산자 : ->

동적 메모리 할당 (1) #include … void f() { char *s; s = (char*)malloc(sizeof(char)*8); s[0] = ‘d’; s[1] = ‘y’; s[2] = ‘n’; s[3] =‘a’; s[4] = ‘m’; s[5] = ‘i’; s[6] = ‘c’; s[7] = ‘\0’; strcpy(s, “dynamic”); free(s); }

동적 메모리 할당 (2) 컴파일시에 메모리의 할당 크기가 정해지는 것이 아니라, 프로그램 실행중에 가변적인 크기의 메모리를 할당 / 해제 할 수 있게 됨 함수내에서 할당된 동적 메모리는 함수 종료 후에 자동 해제 되지 않음 반드시, malloc/free 을 쌍으로 호출하는 습 관을 익힐 것

동적 메모리 할당 (3) #include void *malloc( size_t size ); void free( void *memblock );

포인터 주소 연산 ae a b ff 00007f77 A B C D \0 int *pI; pI = (int*)malloc(sizeof(int)*5); pI[0]=0x10ae; pI[1]=0x10a7; pI[2]=0x10b4; pI[3]=0x30ff; pI[4]=0x7f77; *(pI)=0x10ae; *(pI+1)=0x10a7; *(pI+2)=0x10b4;*(pI+3)=0x30ff; *(pI+4)=0x7f77; char *pC; pC = (char*)malloc(sizeof(char)*5); pC[0]=‘A’; pC[1]=‘B’; pC[2]=‘C’; pC[3]=‘D’; pC[4]=‘\0’; *(pI)=‘A’; *(pI+1)=‘B’; *(pI+2)=‘C’; *(pI+3)=‘D’; *(pI+4)=‘\0’; 0x x x x x x

포인터 이해 (1) int p; /* p is integer */ int p[7]; /* p is array[7] of integer */ int *p; /* p is pointer to integer */ int *p[7]; /* p is array[7] of pointer to integer */ int (*p)[7]; /* p is pointer to array[7] of integer */ int **p; /* p is pointer to pointer to integer */ void f(); /* f is function returning void */ void *f(); /* f is function returning pointer to void */ void (*fp)(); /* fp is pointer to function returning void */ void *(*fp)(); /* fp is pointer to function returning pointer to void */ Void (*fp[7])(); /* fp is array[7] of pointer to function returning void */ 힌트 : 는 [] 나 () 보다 우선 순위가 늦음.

포인터 이해 (2) 형변환 int a[5]; int (*p)[5]; p = (int (*)[5])a; long al = 0x ; Short bl; bl = (short)al;

배열과 포인터 (1) int a[3][5]; col 1col 2col 3col 4col 5 row 1a[0][0]a[0][1]a[0][2]a[0][3]a[0][4] row 2a[1][0]a[1][1]a[1][2]a[1][3]a[1][4] row 3a[2][0]a[2][1]a[2][2]a[2][3]a[2][4] a[i][j]; *(a[i] + j); (*(a+i))[j]; *((*(a+i)) + j) *(&a[0][0] + 5*i +j)

배열과 포인터 (2) 함수 인자로서의 배열 int sum(int a[][5]) { int i, j, sum = 0; for(i=0; i < 3; i++) for(j=0; j < 5; j++) sum += a[i][j] return sum; } int sum(int a[][5]) int sum(int a[3][5]) int sum(int (*a)[5]) { int i, j, sum = 0; for(i=0; i < 3; i++) for(j=0; j < 5; j++) sum += a[i][j] return sum; } int b[][5] = {1,2,3, …}; c = sum(b); /* C- 스타일 */ c = sum((int (*)[5])b); /*C++ 스타일 */

배열과 포인터 (3) 기본적으로 배열과 포인터는 동일한 인터페 이스 3 차원 배열 int sum(int a[][5][7]) int sum(int a[3][5][7]) int sum(int (*a)[5][7]) a[i][j][k] == *(&a[0][0][0] + 5*7*i + 7*j +k)

char * const char *p = “constant”; p[0] = ‘d’; /* not possible */ char *p = “constant”; p[0] = ‘d’; /* not possible */ const qualifier( 한정어 ) : 상수처럼 취급하게 해줌. 즉 변수의 값 이 변하지 않아야 한다는 것을 명시적으로 지정해 준다.

char ** (1) void swapstrings(char *l, char *r) { char *t; t = l; l = r; r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(l, r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (1) void swapstrings(char *l, char *r) { char *t; t = l; l = r; r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(l, r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (1) void swapstrings(char *l, char *r) { char *t; t = l; l = r; r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(l, r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (1) void swapstrings(char *l, char *r) { char *t; t = l; l = r; r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(l, r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (2) void swapstrings(char **l, char **r) { char *t; t = *l; *l = *r; *r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(&l, &r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (2) void swapstrings(char **l, char **r) { char *t; t = *l; *l = *r; *r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(&l, &r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (2) void swapstrings(char **l, char **r) { char *t; t = *l; *l = *r; *r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(&l, &r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

char ** (2) void swapstrings(char **l, char **r) { char *t; t = *l; *l = *r; *r = t; } char *l, *r; l = “left”; r = “right”; swapstrings(&l, &r); 주소메모리내용 “left” 2008“right” l r t l r 맞게 교환되었을까 ?

main 함수의 인자 전달 int main(int argc, char *argv[]) { … return 1; } C:\a.exe this is a final homework. argv[0] argv[1] argv[2] argv[3] argv[4] argv[5] a.exe this is a final homework

과제 (6 월 10 일 자정까지 ) 프로그램 실행시 main 함수의 인자로 받은 문자열을 ASCII 순으로 정렬하여 출력하는 프로그램 작성 교재 6.13 참고 이메일 제출 소스코드 보고서

보고서 작성 요령 소스 코드 설명 정렬이 되는 과정을 설명 보고서 채점 비중 높음 6 월 11 일 기말 고사에서는 과제와 관련된 내 용 출제될 예정