8장 포인터.

Slides:



Advertisements
Similar presentations
1.1 구조체란 1.2 중첩 구조체 1.3 구조체와 배열 1.4 구조체와 포인터 1.5 구조체와 함수 1.6 공용체와 열거형.
Advertisements

03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
제6장 조건문.
프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
C 프로그래밍.
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
C언어: 배열 (Arrays).
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 14. 포인터와 함수에 대한 이해.
제 3 장. 배열과 구조체 및 포인터.
자료 구조: Chapter 3 (2)구조체, 포인터
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
기초C언어 제3주 C프로그램 구성요소, 변수와 자료형 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
컴퓨터 프로그래밍 기초 - 2nd : scanf(), printf() 와 연산자 -
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
C 프로그래밍.
C 프로그래밍.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
Chapter 06. 선택문.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
제2장 데이터형과 표준 입출력문 문봉근.
2019년 2월 24일 오후 4시 59분 제2장 표준 입출력 함수
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
제 8장 구조체 Hello!! C 언어 강성호 김학배 최우영.
Chapter 11. 배열과 포인터.
4장 자료형.
Chapter 05. 입출력 함수.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
포인터.
-Part2- 제1장 1차원 배열이란 무엇인가.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
-Part1- 제7장 반복문이란 무엇인가.
18장. 다차원 배열 그리고 포인터.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
-Part2- 제2장 다차원 배열이란 무엇인가.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
어서와 C언어는 처음이지 제16장.
17장. 포인터의 포인터.
개정판 누구나 즐기는 C언어 콘서트 제11장 구조체, 공용체, 열거형 출처: pixabay.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
C.
printf("Global Korea\n");
Chapter 09. 배열.
배열, 포인터, 함수 Review & 과제 1, 2.
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
11장. 1차원 배열.
Presentation transcript:

8장 포인터

8장 포인터 8.1 포인터와 주소 8.2 포인터 연산자 8.3 포인터와 배열 8.4 포인터와 함수 8.5 함수 포인터 8.1 포인터와 주소 8.2 포인터 연산자 8.3 포인터와 배열 8.4 포인터와 함수 8.5 함수 포인터 8.6 void 포인터 8.7 다중 포인터 2018-11-30

8.1 포인터와 주소(p201) ( ) 주기억 장치의 구조  바이트(byte)들의 집합 ( ) 주기억 장치의 구조  바이트(byte)들의 집합 각 바이트에는 이진수로 된 번호가 붙어 있음  주소 1. 절대주소(Absolute address) H/W적으로 고정되어 있는 주기억장치의 영구적인 주소 8bit=1byte … 2018-11-30

8.1 포인터와 주소(p201) 2. 상대주소 (Relative address) 특정 기점의 주소를 0으로 보고 이를 기준으로 만든 주소 X의 제주소 = 시작주소(Base address) +떨어진 거리(offset) =010000 + 800 = 010800 2018-11-30

포인터 포인터와 포인터 변수 메모리의 ( ) 을 저장하기 위한 변수 “포인터”를 흔히 “( )”라 한다 …. 메모리의 ( ) 을 저장하기 위한 변수 “포인터”를 흔히 “( )”라 한다 c 의 주소? n 의 주소는 ? …. #include <stdio.h> void main( ) { char c = ‘A’; int n=7; double d=3.75; …… } 실제로는 스택영역이기때문에 주소값은 d < n < c …. 2018-11-30

포인터 #include <stdio.h> void main( ) { char c = 'A'; int n=7; double d=3.75; printf("%x \t %x \t %x\n", &c, &n, &d); } 2018-11-30

8.2 포인터 연산자(P203) * 연산자 & 연산자 선언: 포인터 변수 선언 ex) int *p 참조: 포인터 변수내 ( )에 있는 값 ex) x = *p 포인터가 가리키는 ( ) ex) *p=10 & 연산자 변수의 ( )을 반환 : ex) p=&a 주소(32bit) 포인터 연산자 * : 별표(아스터리스크,asterisk) 연산자 포인터 연산자 = ( ) & : 앰퍼샌드(ampersand) 연산자 번지연산자 = ( ) 변수의 주소 값 반환 2018-11-30

8.2 포인터 연산자 #include <stdio.h> int main() { int a; char b[10]; ▶ ( )는 사용 중의 데이터를 놓아두는 곳 ▶ 메모리상의 위치를 ( )라고 한다 ▶ 포인터는 ( )를 보관하기 위한 변수 ▶ 주소는 보통 변수는 앞에 &를 붙여, ( )와 ( )는 이름만으로 주소를 취득할 수 있다. #include <stdio.h> int main() { int a; char b[10]; printf(“a : %x \n b : %x \n main : %x \n”, &a, b, main); return 0; } 2018-11-30

포인터 변수의 선언 포인터 선언 시 사용되는 연산자: * 포인터의 타입 ~형 포인터: ~형 변수의 주소값을 저장 ……. … = 아스터리스크 (asterisk) 연산자 = 포인터 연산자 = 포인터가 가리키는 메모리 참조 포인터 선언 시 사용되는 연산자: * 포인터의 타입 ~형 포인터: ~형 변수의 주소값을 저장 ……. … int *a => 포인터 a는 int형 데이터를 가리킨다. char *b => 포인터 b는 char형 데이터를 가리킨다. double *c => 포인터 c는 double형 데이터를 가리킨다. 2018-11-30

포인터 변수의 선언 * 연산자를 사용하여 다음 세 가지 방식으로 선언 포인터 연산자 int* a; int *a; & : 앰퍼샌드(ampersand) 연산자 번지연산자 = ( ) 변수의 주소 값 반환 * : 별표(아스터리스크, asterisk) 연산자 ( ) 포인터가 가리키는 메모리 참조 2018-11-30

포인터 타입 포인터의 타입과 크기 다양한 포인터 타입이 존재하는 이유 예) char *p1; int *p2; double *p3; sizeof(p1)=? sizeof(*p1) = ? sizeof(p2)=? sizeof(*p2) = ? sizeof(p3)=? sizeof(*p3) = ? 다양한 포인터 타입이 존재하는 이유 참조할 메모리의 크기 정보를 제공 포인터는 “( ) +( )” 포인터의 크기 = 4바이트 2018-11-30

포인터 타입 포인터 변수의 크기는 포인터 변수가 참조하는 변수의 데이터형에 관계없이 항상 같다. 2018-11-30

char형 포인터 #include <stdio.h> void main(void) { char c; char *p=NULL; // 포인터변수 p 선언 c= ‘A’; p= &c; // 포인터변수에 c의 주소값대입 printf(“%c %c\n”, c, *p); printf(“%d %d\n”,sizeof(c), sizeof(p)); printf(“%d %d\n”,sizeof(&c), sizeof(*p)); return; } 1byte 참조 왜? char *p 로 선언하여 char형 변수 c를 참조하고 있기때문 2018-11-30

int형 포인터 #include <stdio.h> void main(void) { int a; int *p=NULL; a= 2011; p= &a; printf(“%d %d\n”, a, *p); printf(“%d %d\n”,sizeof(a), sizeof(p)); return; } 4byte 참조 왜? int *p 로 선언하여 int형 변수 a를 참조하고 있기때문 2018-11-30

char형 주소의 연산 &c void main(void) { 그럼 char c='A'; &p의 값은??? char *p= &c; printf("c=%c *p=%c\n\n", c,*p); printf("&c= %x\n", &c); printf("p = %x\n", p); printf("&c+1 = %x\n", &c+1); printf("p+1 = %x\n", p+1); return; } 그럼 &p의 값은??? &c p+1 2018-11-30

char형 주소의 연산 실행결과 2018-11-30

int형 주소의 연산 void main(void) { 그럼 int a=100; &p의 값은??? int *p= &a; printf("a = %d, *p = %d\n\n",a, *p); printf("&a = %x\n", &a); printf("p = %x\n\n", p); printf("&a+1 = %x\n", &a+1); printf("p+1 = %x\n\n", p+1); return; } 그럼 &p의 값은??? p+1 2018-11-30

int형 주소의 연산 실행결과 2018-11-30

예제(p204) 2018-11-30

예제1 정수형 변수 x 선언 정수형 포인터 변수 p 선언 x 에는 100을 대입 p에 변수 x의 주소를 대입(p는 x를 참조) 다음을 출력하는 프로그램을 작성하시오. (1)변수 x의 값 (2)포인터 p의 값 (3)변수 x의 주소 (4)포인터 p의 주소 (5)포인터 p가 참조하는 곳의 내용 2018-11-30

예제1 - 소스 #include <stdio.h> void main() { ; printf("(1)변수 x의 값 : \n", ); printf("(2)포인터 p의 값 : ( )\n", , ); printf("(3)변수 x의 주소 : \n", ); printf("(4)포인터 p의 주소 : \n", ); printf("(5)포인터 p가 참조하는 곳의 내용 : \n", ); } 2018-11-30

예제2 float형 변수 x 선언 float형 포인터 변수 p 선언 x에 3.14159를 대입 p에 변수 x의 주소를 대입(p는 x를 참조) 다음을 출력하는 프로그램을 작성하시오. (1)변수 x의 값 (2)포인터 p의 값 (3)변수 x의 주소 (4)포인터 p의 주소 (5)포인터 p가 참조하는 곳의 내용 2018-11-30

예제2 - 소스 #include <stdio.h> void main() { ; printf("(1)변수 x의 값 : \n", ); printf("(2)포인터 p의 값 : ( )\n", , ); printf("(3)변수 x의 주소 : \n", ); printf("(4)포인터 p의 주소 : \n", ); printf("(5)포인터 p가 참조하는 곳의 내용 : \n", ); } 2018-11-30

Review 예제1 문자 한개를 키보드로부터 입력받아 저장 char형 포인터 변수를 사용하여 그 값을 출력하는 프로그램을 작성하시오 getchar( )함수, printf( )함수 이용 실행결과   2018-11-30

Review 예제1 #include <stdio.h> void main() { ; x= (); p = ; printf("입력된 문자 = \n", ); printf(" *p = \n", ); } 2018-11-30

Review 예제2 정수값 2개를 입력받아 두수의 합을 포인터를 사용하여 출력하는 프로그램을 작성하시오. scanf( )함수 이용 실행결과 2018-11-30

Review 예제2 #include <stdio.h> void main() { ; printf("두개의 정수를 입력하시오:"); scanf("%d, %d", , ); sum = ; p = ; printf("a = , b = , sum = \n", , , ); printf("a + b = \n", ); } 2018-11-30

8.3 포인터와 배열 (P206) 배열의 이름 ( )을 나타낸다. a+1=? int a[5]={ 1, 2, 3, 4, 5 }; ( )을 나타낸다. a+1=? &a[0] &a[1] &a[2] &a[3] &a[4] 0x1000 0x1004 0x1008 0x100c 0x1010 ... a a[0] a[1] a[2] a[3] a[4] int a[5]={ 1, 2, 3, 4, 5 }; 2018-11-30

8.3 포인터와 배열 인덱스 없이 배열명만 사용하면 ( )를 의미 배열의 ( )를 구할 때는 & 없이 ( )만 사용 인덱스 없이 배열명만 사용하면 ( )를 의미 배열의 ( )를 구할 때는 & 없이 ( )만 사용 2018-11-30

8.3 포인터와 배열 배열이름과 포인터의 비교 2018-11-30

8.3 포인터와 배열 배열 이름의 타입 배열이름도 포인터이므로 타입이 존재 배열 이름이 가리키는 배열 원소에 의해 결정 2018-11-30

예제(P206) 2018-11-30

배열이름과 포인터의 관계(p208) 배열 x의 i번째 원소 ( ) 예제 (p208) int main( ) { ( ) 예제 (p208) int main( ) { int x[10] , i=1; x[i] =7; printf(“x[i]=%d, *(x+i)=%d, *(i+x)=%d, i[x]=%d\n”, x[i], *(x+i), *(i+x) , i[x]); return 0; } 2018-11-30

배열이름과 포인터의 관계(p208) *(arr+i)는 ( )를 의미한다. 배열의 시작 주소에서 int i개 크기만큼 증가된 주소에 있는 값 2018-11-30

배열이름과 포인터의 관계 배열 이름의 활용 배열 이름을 포인터처럼, 포인터를 배열이름처럼 활용하는 것이 가능! 2018-11-30

배열이름과 포인터의 관계 2018-11-30

문자 배열과 포인터(p208) 문자 배열 변수에 문자 상수값 대입하는 경우(값의 복사) 문자 배열 변수에 문자열 상수값 대입하는 경우(값의 복사) 포인터에 문자열 상수 대입하는 경우(주소 대입) 문자 배열변수 chx a b c d e char chx[5] = {‘a’, ‘b’, ’c’, ’d’, ’e’}; char chy[6] = “abcde”; char *chz = “abcde”; chx[0] chx[1] chx[2] chx[3] chx[4] 문자 배열변수 chy a b c d e chy[0] chy[1] chy[2] chy[3] chy[4] chy[5] * 불가능한 연산 chx = chy chz[2] =‘k’; 문자 상수 a b c d e 포인터(chz) 문자열 상수 a b c d e 0 2018-11-30

배열과 포인터의 차이점 배열이 메모리에 할당되고 나면, 배열의 시작 주소를 변경할 수 없다. 포인터 변수는 값을 변경할 수 있으므로, 포인터 변수에 보관된 주소는 변경할 수 있다. 2018-11-30

8.4 포인터와 함수(P210) 함수 호출 : 다른 함수를 호출하는 함수의 인수 : 호출되는 함수의 인수 (call by value) (call by reference) 2018-11-30

8.4 포인터와 함수 Call- By- Value ( )에 의한 함수 호출 2018-11-30

8.4 포인터와 함수(P212) 2018-11-30

8.4 포인터와 함수 Call-By-Reference ( )를 인수로 전달하는 형태의 함수 호출 2018-11-30

8.4 포인터와 함수(P213) 2018-11-30

8.4 포인터와 함수 Scanf 함수 호출(Call-By-Reference) Case1 Case2 2018-11-30

배열을 함수의 인수로 전달 배열이름, 포인터의 sizeof 연산 배열이름: ( ) 를 바이트 단위로 반환 배열이름: ( ) 를 바이트 단위로 반환 포인터: 포인터의 크기를 반환(4 바이트) 2018-11-30

배열이름을 함수의 인수로 전달 함수의 매개변수( int ptr[] ) == (* ptr )과 같은 의미 2018-11-30

예제(p214) 2018-11-30

8.5 함수 포인터(Function Pointer)-P215 함수의 주소를 갖고 있는 포인터 함수의 코드가 시작되는 위치의 주소값을 나타냄 선언형식 ex) int (*fp1)(int) int값을 입력매개변수로 갖고 int값을 리턴하는 함수를 가리키는 fp1이라는 함수포인터 선언 ex) void (*fp2)( ) 입력매개변수와 리턴값이 void인 함수를 가리키는 fp2라는 함수포인터 선언 주의 함수 포인터의 반환자료형과 매개변수의 자료형은 함수 포인터가 가리키는 함수의 것과 일치해야 함 반환자료형 (*함수명)(매개변수자료형) 2018-11-30

예제 – P217 #include <stdio.h> void func(int); int main( ){ void (*fp)(int); //변수처럼 함수포인터 선언 fp=func; //함수포인터에 func라는 함수의 주소를 대입 (*fp)(1); //실인수값 1로 함수포인터가 가리키고 있는 함수호출 fp(2); //실인수값 2로 함수포인터가 가리키고 있는 함수호출 return 0; } void func(int arg){ printf(“%d\n”, arg); 2018-11-30

8.6 void 포인터-P221 void 포인터 예제(p222) ( ) 주의사항 ( ) 주의사항 데이터형이 지정되지 않았기 때문에 사용하기 위해서는, 반드시 ( )연산자를 이용하여 형변환을 해야함 예제(p222) #include <stdio.h> int main( ){ int n=10; void *vptr=&n; //void형 포인터 선언 & 초기화 *((int*)vptr) =20; //20을 대입하기 위해 int형으로 형변환 printf("\nn=%d",n); return 0; } 2018-11-30

8.6 void 포인터-P221 #include <stdio.h> int main( ){ int n=10; void *vptr = &n; // void형 포인터 선언 & 초기화 int *iptr = &n; // int형 포인터 선언 & 초기화 (형변환필요x) *((int *)vptr) =20; // 20을 대입하기 위해 int형으로 형변환 printf("n=%d\n",n); (*((int *)vptr))++; // 증감 연산자 사용하기 복잡함 printf("*vptr = %d\n", *((int *)vptr)); (*iptr)++; printf("*iptr = %d\n", *iptr); return 0; } 2018-11-30

8.7 다중 포인터(222) 포인터 배열 배열의 원소로 포인터를 지니는 배열 포인터 ptr a b c 0 d e f g 0 촟ㅊ char *ptr[3] ={ “abc”, “defg”, “h” }; a b c 0 문자열 상수 포인터 ptr[0] d e f g 0 포인터 ptr[1] h 0 포인터 ptr[2] 포인터 ptr for (i = 0 ; i < 3 ; i++) printf("%x %x %x %s \n", ptr, &ptr[i], ptr[i], ptr[i]); 0x420030 0x420028 0x420024 0x18ff38 0x18ff3c 0x18ff40 2018-11-30

8.7 다중 포인터 포인터 배열 예제 for(i = 0; i < 3; i++) printf("%x %x %d\n", &arr[i], arr[i], *arr[i]); 포인터 배열 예제 0x18ff34 0x18ff30 0x18ff2c 0x18ff20 0x18ff24 0x18ff28 2018-11-30

8.7 다중 포인터 생각해보기.. void main(){ char name[3][10] = { "Jasmine", "Bell", "Chris"}; char *pstr[3] = { name[0], name[1], name[2] }; for (i = 0; i < 3; i++) printf("%x %s %s\n", pstr[i], pstr[i], name[i]); } 2018-11-30

8.7 다중 포인터 (223) int (*pnt_z)[10] = “abcdefg”; int pnt[10] = “abcdefg”; pnt_z “abcdefg” pnt “abcdefg” 2018-11-30

8.7 다중 포인터 (p.223) #include<stdio.h> void main() { char ptr[10] = "abcdefg"; char (*pptr)[10] = "abcdefg"; printf("%x %x %s\n", ptr, &ptr[0], ptr); printf("%d %d\n", sizeof(ptr), sizeof(*ptr)); printf("%x %x %s\n", pptr, &pptr[0], pptr); printf("%d %d\n", sizeof(pptr), sizeof(*pptr)); } 2018-11-30

8.7 다중 포인터 포인터의 포인터 포인터를 가리키는 포인터 표 참조(p223) 2018-11-30

예제(p223) 2018-11-30

예제 1 1) 정수형 배열 x, y, z를 선언하고 다음에 주어진 데이터로 초기화하라. 2) 정수형 포인터 배열 p[2]를 선언하고, 포인터 p[0]에는 배열 x의 시작 주소를 포인터 p[1]에는 배열 y의 시작 주소를 대입하라 3) 반복문(for문)을 이용하여 두 포인터 p[0]와 p[1]이 각각 가리키는 정수형 데이터의 합을 차례로 z[0]~z[4]에 대입하라 x[0]~x[4] , y[0]~y[4] ,z[0]~z[4]의 값을 출력하라 2018-11-30

예제 2 1) 정수형 배열 x[10]을 선언하고 다음 값으로 초기화하라 2) 정수형 포인터 배열 p[2]를 선언하고 데이터:11,22,43,56,36,73,45,66,98,0 2) 정수형 포인터 배열 p[2]를 선언하고 배열 x의 시작 어드레스로 포인터 p[0]을 초기화하고 배열 x의 마지막 어드레스로 포인터 p[1]를 초기화하라 3) 이때 p[0]과 p[1]을 비교하면서 p[0]과 p[1]가 같게 될 때 까지 p[0]가 가리키는 값을 출력하시오. (반복문이나 조건문을 적절히 이용) 4) 데이터:11,22,43,56,36,73,45,66,98,73 으로 변경하는 경우는?? 2018-11-30

예제(call-by-reference) Main() 함수 안에 문자열 포인터 배열 p[4]를 선언하고 다음 데이터로 초기화하라 (데이터 : “My”, “name”, “is”, “Jessica.”) 포인터 배열 p와 4(배열원소 개수)를 실인수로 하여 myName( )이라는 함수를 호출하라(myName(p, 4) ) 포인터 배열 p의 원소들이 가리키는 문자열을 차례로 출력하라 myName( ) 함수에서 두개의 매개변수(가인수)를 활용해서 Main()함수내에서 선언된 포인터 배열 p의 4번째 문자열의 값을 본인의 이름으로 변경하라 2018-11-30

구조체 (Structure) 구조체 하나 이상의 기본 자료형 변수들을 묶어서 그룹화하는 ( ) 구조체 정의 2018-11-30

구조체 변수 struct point struct point { { int x; int x; int y; int y; *구조체 정의와 변수 선언을 동시에 struct point { int x; int y; } p1, p2, p3;   int main(void) … return 0; }  *구조체 정의와 변수 선언을 따로 struct point { int x; int y; };   int main(void) struct point p1, p2, p3; … return 0; }  2018-11-30

구조체 변수 구조체 변수의 멤버 변수 #include <stdio.h> struct group // 구조체 정의 { int a; double b; }; int main(void) struct group g1; // 구조체 변수 g1 선언 g1.a =10; // 구조체 변수 g1의 멤버변수 a에 접근 g1.b =1.1234; // 구조체 변수 g1의 멤버변수 b에 접근 printf("g1.a의 값: %d \n", g1.a); printf("g1.a + g1.b = %f\n", g1.a+g1.b); return 0; } 2018-11-30

구조체 변수(p96) 2018-11-30

구조체 변수 구조체 변수의 “초기화” #include <stdio.h> struct point { int x; int y; }; int main(void) struct point p1={10, 20}; // 구조체 변수 선언과 동시에 초기화 printf("%d %d \n", p1.x, p1.y); return 0; } 2018-11-30

구조체 변수 구조체 변수의 “초기화” 시 주의사항 struct point p1 = {10, 20}; // 정상 p1.x=10; // 정상 p1.y=20; // 정상 2018-11-30

구조체 변수(P97) 2018-11-30

구조체 변수(P97) #include <stdio.h> struct list { char *name; // 이름을 문자열로 char sex; int age; }; void main() { struct list a, b = {"Jason", 'M', 60}; a.name = "Test"; a.sex = 'F'; a.age = 40; printf("No\tname\tsex\tage\n"); printf("%d\t%s\t%c\t%d\n", 1, a.name, a.sex, a.age); printf("%d\t%s\t%c\t%d\n", 2, b.name, b.sex, b.age); } 2018-11-30

구조체 변수 구조체 변수의 복사 일반 변수의 복사와 같이 구조체 변수 간 복사가능 int a=3; int b=0; b=a; // 변수의 복사 printf("%d %d \n", a, b); struct point { int x; int y; }; struct point p1={10, 20}; struct point p2={0, 0}; p2=p1; // 구조체 변수의 복사 2018-11-30

구조체와 포인터 멤버변수로 포인터 사용하기 ‘. 연산자가 *연산자보다 우선순위가 높다.’ #include <stdio.h> struct point { int* x; // 포인터 멤버변수 int* y; }; int main(void) int num1=4; int num2=5; struct point p1; p1.x=&num1; p1.y=&num2; printf("%d %d \n", num1, num2); printf("%d %d \n", *p1.x, *p1.y); return 0; } ‘. 연산자가 *연산자보다 우선순위가 높다.’ 2018-11-30

*p1.z는??? #include <stdio.h> struct point { int* x; // 포인터 멤버변수 int* y; char* z; }; int main(void) int num1=4; int num2=5; char name[30]="201405123 Adam"; struct point p1; p1.x=&num1; p1.y=&num2; p1.z = name; printf("%d %d %s\n", num1, num2, name); printf("%d %d %s\n", *p1.x, *p1.y, p1.z); return 0; } *p1.z는??? 2018-11-30

구조체와 포인터 구조체포인터 p의 경우 구조체 포인터 변수사용하기 #include <stdio.h> struct student { char no[10]; // 학번 char name[20]; // 이름 double total; // 총점 }; int main(void) struct student s = {"20101323", "Park", 160}; struct student *p; // 구조체 포인터 변수 선언 p = &s; printf("%s %s %lf \n", s.no, s.name, s.total); printf("%s %s %lf \n", (*p).no, (*p).name, (*p).total); printf("%s %s %lf \n", p->no, p->name, p->total); return 0; } 구조체포인터 p의 경우 2018-11-30

구조체와 함수 값에 의한 호출(call-by-value) 2018-11-30

구조체와 함수 #include<stdio.h> struct point // 구조체 정의 { int x; int y; }; void function (struct point call); // 함수의 선언 int main(void) struct point p= {10, 20}; function(p); // 값에 의한 호출(call by value)   return 0; } void function (struct point call) // 함수의 정의 printf("%d %d \n", call.x, call.y); // 10, 20 출력 2018-11-30

구조체와 함수 call.x = 30; call.y = 40; ???? int main(void) { struct point p = { 10, 20 }; function ( p ); … } p는 call에 복사됨 void function (struct point call) { printf("%d %d \n", call.x, call.y);} call.x = 30; call.y = 40; ???? 2018-11-30

구조체와 함수 주소에 의한 호출(call-by- reference) 2018-11-30

구조체와 함수 #include<stdio.h> struct point { int x; int y; }; void function (struct point* call); // 함수의 선언 int main(void) struct point p = {10, 20}; function(&p); // 주소에 의한 호출(call by reference)   return 0; } void function (struct point *call) // 함수의 정의 printf("%d %d \n", call->x, call->y); printf("%d %d \n", (*call).x, (*call).y); 2018-11-30

구조체와 함수 call->x = 30; *(call).y = 40; int main(void) { struct point p = { 10, 20 }; function ( &p ); … } p의 주소가 포인터 변수 call에 저장 void function (struct point* call) { printf("%d %d \n", call->x, call->y); printf("%d %d \n", (*call).x, (*call).y); } call->x = 30; *(call).y = 40; 2018-11-30

구조체와 함수(예제) 다음 멤버변수들을 갖는 구조체 student를 정의 하시오 char Name[30]; int Math, Eng, Clang; float Avg; 구조체 student형 변수 s를 선언하고 s의 각 멤버변수의 값을 자신의 이름과, 본인의 예상점수(Math, Eng, Clang)로 초기화 하시오 구조체 student형 변수 s의 주소값을 넘겨 주면서 함수 getAvg( )를 호출하시오(call-by-reference) 이름과 평균값을 출력하시오 함수 getAvg( ) 구조체변수의 멤버변수 Math, Eng, Clang의 평균을 계산하여 멤버변수 Avg의 값으로 대입하시오. 2018-11-30

예제 이름, 국어, 영어, 수학, 과학, 총점, 평균(소수점 2자리 까지 표현)의 자료형을 가지는 구조체 변수를 선언하여 main에서 각 자료를 입력받아 calc(구조체 포인터)함수를 만들어 총점 및 평균값을 구해서 저장한다. main에서 이름, 총점, 평균을 출력하는 예제 작성 문자열 name, 정수형 kor, eng, math, sci, sum, 실수형 avg 2018-11-30

p->sum = (*p).sum ≠ *(p.sum) = *p.sum struct student { int sum; } *p; int *sum; } p; 2018-11-30