프로그래밍실습 제 13 강.

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

기본 자료형 순천향대학교 정보기술공학부 이 상 정. 자료형의 선언 컴퓨터프로그래밍 1 순천향대학교 정보기술공학부 이 상 정 3 자료형 선언 기본 자료형문자형 char 정수형 int 실수형 float double 형없음 void.
 수학 10- 나  1 학년 2 학기  Ⅰ. 도형의 방정식 1. 평면좌표 (1/24) 두 점 사이의 거리 수업 계획 수업 활동.
컴퓨터 개론 및 실습 강의 9.
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
배열, 포인터 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
배열(Array) 선린인터넷고등학교 정보통신과 유 순 옥.
Part 10 포인터 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2011
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
4장: 자료형과 수식.
C언어: 배열 (Arrays).
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
자료 구조: Chapter 3 (2)구조체, 포인터
8장 포인터.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
Chapter 4 – 연 산 자 Outline 4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
프로그래밍실습 제 17 강.
Chapter 10. 포인터.
프로그래밍실습 제 16 강.
제 3 장 상수와 변수
4주차: Data Types and Functions
5장. 상수와 기본 자료형. 5장. 상수와 기본 자료형 5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 int val; "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자.
우리생활속의 확률 이용사례탐구 한림초등학교영재학급 6학년 김수민.
13. 포인터와 배열! 함께 이해하기.
Chapter 10 함수 기본.
제2장 데이터형과 표준 입출력문 문봉근.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
자전거를 배우려면 안장에 올라가 페달을 밟아라.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
제 3 장 연산자 (Operators).
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
제어문 & 반복문 C스터디 2주차.
제 1 강.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
Chapter 11. 배열과 포인터.
Part 09 배열 안산1대학 디지털정보통신과 임 성 국.
Chapter 05. 입출력 함수.
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
제 3장 데이터형과 연산자 Hello!! C 언어 강성호 김학배 최우영.
포인터.
학습목표 Chapter 2-1. 변수와 포인터 변수의 선언과 변수에 대한 메모리 할당을 살펴본다.
-Part2- 제1장 1차원 배열이란 무엇인가.
Part 06 세상을 변화시키는 연산자 안산1대학 디지털정보통신과 임 성 국.
-Part1- 제6장 자료형이란 무엇인가.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
컴퓨터 프로그램은 여러 기능의 복합체이다. 라이브러리 함수와 사용자 정의 함수
-Part2- 제2장 다차원 배열이란 무엇인가.
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
엔화 대환/대출 자금용도 대상 이자 차액 효과 (A,B,C) 환율 리스크 헷징 (A,B) 엔화의 평균환율 (A,B,C)
9주차: Using Files and Others
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
3주차: Control Flow and Others
어서와 C언어는 처음이지 제16장.
C.
배열, 포인터, 함수 Review & 과제 1, 2.
Presentation transcript:

프로그래밍실습 제 13 강

강의 내용 포인터(pointer) 포인터 출력 (%p또는 %u 사용) 포인터의 출력: 배열의 경우(1) 포인터 변수: 포인터를 저장하는 변수 부함수를 사용한 두 수의 합의 계산 방법1: return문을 사용한 기존의 방법 방법2: 포인터의 사용 포인터를 사용하지 않으면?

제8장: 포인터(pointer) #include<stdio.h> main() { int a=10, b=20; * 모든 변수는 기억장소에 저장된다. * 각 기억장소마다 각자의 주소(address)가 주어져 있으며, 서로 다른 기억장소는 서로 다른 주소를 갖는다. * 포인터는 기억장소의 주소이며, 기억장소의 주소는 변수이름 앞에 &를 붙여 나타낸다. * 주소를 출력하는 변환문자는 %p를 주로 사용하며 16진수로 주소가 출력된다. (%u를 사용하면 10진수 출력을 얻을 수 있다.) #include<stdio.h> main() { int a=10, b=20; printf("%p %p\n",&a,&b); //주소의 16진수 출력 } 출력 예: 00CAF8EC 00CAF8E0

#include<stdio.h> main() { int a=20, b=10; //주소의 10진수 출력 #include<stdio.h> main() { int a=20, b=10; printf("%u %u\n",&a,&b); } 출력 예: 13301984 13301996 기억장소의 주소는 바이트 단위로 할당된다. * 여러 바이트를 차지하는 변수의 경우 변수의 주소는 그 변수를 위해 할당된 기억장소의 최상위 바이트의 주소를 말한다. * 따라서 4바이트를 차지하는 int형의 경우 그 기억장소를 나타내는 4개의 주소 중 최상위 바이트의 주소가 기억장소의 주소가 된다.

포인터 출력 (%p또는 %u 사용) #include<stdio.h> main() { double a=10, b=20; printf("%u %u\n",&a,&b); // 10진수 출력 } 출력 예: 1245048 1245040

포인터의 출력: 배열의 경우(1) #include<stdio.h> main() { short i; short a[4]={10,20,30,40}; for(i=0;i<4;i++) printf("%u\n",&a[i]); } 출력 예: 7077560 7077562 7077564 7077566

포인터의 출력: 배열의 경우(2) #include<stdio.h> main() { int a[2][2]; printf("%u\n",&a[0][0]); printf("%u\n",&a[0][1]); printf("%u\n",&a[1][0]); printf("%u\n",&a[1][1]); } 출력 예: 1245040 1245044 1245048 1245052 (  4씩 차이가 난다. int형은 4바이트)

포인터의 출력: 배열의 경우(3) #include<stdio.h> main() { //배열이름은 그 배열의 첫 번째 변수의 주소를 나타낸다. #include<stdio.h> main() { int a[2][2]={10,20,30,40}; printf("%p %p\n",&a[0][0],a); printf("%d %p\n",a[0][0],a); } 출력 예: 0012FF70 0012FF70 (  &a[0][0]과 a는 같다.) 10 0012FF70 (  a[0][0]과 a는 다르다.)

포인터 변수: 포인터를 저장하는 변수 포인터 변수는 기억장소의 주소를 저장한다. 즉, 포인터 상수를 저장한다. 포인터 변수의 선언을 위해서는 변수이름 앞에 *를 추가한다. 포인터 변수의 형은 그 주소에 저장되는 일반 변수형과 일치해야 한다. 변수 선언이 아닌 일반 실행문에서의 변수이름 앞에 *는 그 주소가 가리키는 변수에 저장된 값을 나타낸다. #include<stdio.h> main() { int i=100; int *a; // 변수 a는 int* 형임을 선언함. // 즉 변수 a가 포인터 변수임을 선언함 a=&i; // 변수 a에는 int형 변수 i의 기억장소의 주소가 저장됨 printf("%d\n", *a); // 여기서의 *a는 a가 가리키는 // 주소에 저장된 값. 즉 변수 i에 저장된 값 printf("%u\n", a); } 출력: 100 1245052

포인터 변수의 형은 그 주소에 저장되는 일반 변수 형과 일치해야 한다. int *a, b; double *c, *d, e=0.917; float *f, *g, h=3.14f; char *i, j=’A’; a=&b; c=&e; f=&h; i=&j; . . . . . . 주의: 위 예에서 d=&b; 로 할 수는 없다.

//double형 포인터 #include<stdio.h> main() { double a=1.0, *p; p=&a; printf("%.1f\n",a); printf("%u\n",&a); printf("%u\n",p); printf("%d\n",sizeof(double*)); printf("%d\n",&p); printf("%.1f\n",*p); } 출력: 1.0 4913936 4 4913924

부함수를 사용한 두 수의 합의 계산 방법1: return문을 사용한 기존의 방법 #include<stdio.h> main() { int sum(int,int); int a=100,b=200,c; c=sum(a,b); printf("합은 %d입니다.\n",c); } int sum(int a, int b) int c; c=a+b; return c;

참고: 앞의 예에 대하여 주함수와 부함수에서 사용된 변수들의 주소를 다음과 같이 각각 출력하여 보자. #include<stdio.h> main() { int sum(int,int); int a=100,b=200,c; c=sum(a,b); printf("합은 %d입니다.\n",c); printf(“주함수: &a=%p &b=%p &c=%p\n",&a,&b,&c); } int sum(int a, int b) int c; c=a+b; printf(“부함수: &a=%p &b=%p &c=%p\n",&a,&b,&c); return c;

출력 예: 부함수: &a=0018FBC8 &b=0018FBCC &c=0018FBB8 합은 300입니다. 주함수: &a=0018FCB8 &b=0018FCAC &c=0018FCA0 (변수의 주소가 모두 다름을 알 수 있다.)

방법2: 포인터의 사용 #include<stdio.h> main() { void sum(int,int,int*); int a=100,b=200,c; sum(a,b,&c); // &c : 주소에 의한 전달 printf("합은 %d입니다.\n",c); } void sum(int a, int b, int *c) // c는 int* 형 변수 *c=a+b; // c가 가리키는 주소에 저장된 값을 a,b의 합으로 바꿈 출력: 합은 300입니다. 중요: 이 경우 return 문이 사용되지 않았음에도 불구하고 부함수에서의 계산 결과는 주함수의 c값에 영향을 준다. (부함수에서의 *를 간접연산자(indirection operator)라 부른다.)

이유: 주함수에서 부함수 호출시 ‘주소’를 전달하고 있음에 유의하라.(주소에 의한 호출) 따라서 주함수의 변수 c의 주소는 부함수의 변수 c에 전달되어 사용된다. 하나의 주소(기억장소)에는 단 하나의 값만 저장된다. (두 개의 다른 값이 같은 주소에 저장될 수 없다.) 이 경우 부함수에서 직접 주함수의 변수 c에 접근하여 저장된 값을 바꾸게 된다.

// 주함수와 부함수에서 각 변수의 주소를 출력해 보자. #include<stdio.h> main() { void sum(int,int,int*); int a=100,b=200,c; sum(a,b,&c); // &c : 주소에 의한 전달 printf("합은 %d입니다.\n",c); printf("주함수: %u %u %u\n",&a,&b,&c); } void sum(int a, int b, int *c) // c는 int* 형 변수 *c=a+b; // c가 가리키는 주소에 저장된 값을 a,b의 합으로 바꿈 printf("부함수: %u %u %u %u\n",&a,&b,c,&c); 출력 예: 부함수: 16709652 16709656 16709908 16709660 합은 300입니다. 주함수: 16709900 16709904 16709908

부함수 호출 및 계산 과정의 이해 부함수 호출 100 100 200 200 16709908 300 *c=a+b

참고: 부함수에서 사용되는 변수의 이름은 중요하지 않다. #include<stdio.h> main() { void sum(int,int,int*); int a=100,b=200,c; printf("주함수에서 c의 주소: %p\n",&c); sum(a,b,&c); printf("합은 %d입니다.\n",c); } void sum(int a, int b, int *d) // 포인터 변수 이름으로 d를 사용 printf("부함수에서 d에 저장된 주소: %p\n",d); *d=a+b; 출력: 주함수에서 c의 주소: 0012FF3C 부함수에서 d에 저장된 주소: 0012FF3C 합은 300입니다.

주의: 포인터를 사용하지 않으면? #include<stdio.h> main() { void sum(int,int,int); int a=100,b=200,c; sum(a,b,c); // 값에 의한 전달 printf("합은 %d입니다.\n",c); } void sum(int a, int b, int c) // c는 int 형 변수 c=a+b; // 여기에서의 c값은 주함수로 전달되지 않는다. 출력 예: 합은 -858993460입니다. (쓰레기 값, garbage)

이유: 아래에서처럼 주소를 출력하여 보면 주함수와 부함수에서의 c는 전혀 다른 주소를 사용한다.(즉, 서로 다른 변수이다.) 따라서 부함수에서의 변화가 주함수에 영향을 줄 수 없다. #include<stdio.h> main() { void sum(int,int,int); int a=100,b=200,c; printf("주함수: c의 주소: %p\n",&c); sum(a,b,c); printf("합은 %d입니다.\n",c); } void sum(int a, int b, int c) printf("부함수: c의 주소: %p\n",&c); c=a+b; 출력 예: 주함수: c의 주소: 0012FF3C 부함수: c의 주소: 0012FEEC 합은 -858993460입니다.

중요한 점: 부함수로 전달되는 것은 항상 상수이다. #include<stdio.h> main() { int sum(int,int); int a=100,b=200,c; c=sum(a,b); //함수의 호출 printf("합은 %d입니다.\n",c); } int sum(int a, int b) return a+b; 위 프로그램에서 함수 호출시 부함수로 전달되는 것은? 답: 100, 200 (즉, 상수 2개)

따라서 다음과 같이 프로그램하는 것이 가능하다. #include<stdio.h> main() { int sum(int,int); int c; c=sum(100,200); //함수의 호출 printf("합은 %d입니다.\n",c); } int sum(int a, int b) return a+b; 위 프로그램에서 함수 호출시 부함수로 전달되는 것은? 답: 100, 200 (즉, 상수 2개)

정수 n의 값을 입력하면 이를 부함수로 전달하고 출력하는 프로그램을 만들어보자. (단, 포인터를 사용해야 하며 return문을 사용할 수 없다.) #include<stdio.h> main() { int n,s; void square(int,int*); printf("정수 n입력: "); scanf("%d",&n); square(n,&s); printf("n=%d n*n=%d\n",n,s); } void square(int n, int *s) *s=n*n;

참고: 포인터 변수를 사용하여 앞의 예를 다음과 같이 바꿔도 된다. #include<stdio.h> main() { int n,s,*p; void square(int,int*); printf("정수 n입력: "); scanf("%d",&n); p=&s; square(n,p); printf("n=%d n*n=%d\n",n,s); } void square(int n, int *s) *s=n*n; //부함수로 전달되는 것은? n에 저장된 값과 s의 주소 중요한 점: 이 예에서 부함수 호출시 일반 상수 하나와 포인터 상수 하나가 부함수로 전달된다. 즉, 전달되는 것은 모두 상수이다.