최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

Download Report

Transcript 최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

최신 C 프로그래밍 언어
문제해결에서 프로그래밍까지
개정판
8장 : 포인터
도서출판 - 인터비젼
1
8장 포인터

학습목표




1. 포인터의 개념을 이해한다.
2. 배열과 포인터의 관계를 이해한다.
3. 포인터를 이용한 주소 계산과 활용 방법을 이해한다.
4. 포인터를 이용한 동적 메모리 할당과 사용법을
이해한다.
 5. 포인터 활용 연산자에 대해 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
2
목차

8장 포인터
 예습시간
–
–
–
–
–
–
1. 포인터의 개념
[기초다지기] 포인터 개념 익히기
2. 배열과 포인터 그리고 연산자
[기초다지기] 배열과 포인터 관계 이해하기
3. 메모리 동적 할당 함수
[기초다지기] 메모리와 동적 할당 함수 이해하기
 실습시간
– 포인터와 관련 연산자 활용
– 동적 메모리 활용
 연습시간
– 포인터 분석
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
3
예습시간 – 1 교시
포인터의 개념
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
4
포인터의 개념

학습 개요
 포인터의 의미와 활용 방법을 다룬다.
 주소 관련 연산자를 이해한다.
 다중 포인터의 개념에 대해 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
5
포인터의 개념

포인터의 개요
 데이터 값의 위치를 나타내는 메모리 주소를 저장하기
위해 사용되는 특별한 변수
 일반변수
– 특정 공간의 메모리 주소에 할당되고 변수 이름을 통해 접근
 포인터
– 특정 공간의 메모리 주소를 저장하는 변수
– 포인터 변수를 통해 메모리 주소의 조작이 가능
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
6
포인터의 개념

포인터 변수의 선언
 포인터 변수를 사용하기 위해 먼저 선언되어야 한다.
 선언 방법
– [데이터 형] *[포인터변수명];
» 데이터 형 : 저장된 주소가 가리키는 공간에 저장된 데이터 형
» 포인터 변수명 : 주소를 저장할 공간의 이름
» 사용 예 : int *px;
포인터 변수의
크기는 4byte이다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
7
포인터의 개념

주소 관련 연산자
 포인터 변수의 활용
– 어떻게 값이 저장된 변수의 주소를 얻어올 수 있는가?
» 주소 연산자(&)
» 변수의 주소 값을 얻어오는 연산자
– 어떻게 포인터 변수가 가리키고 있는 주소의 실제 값을 얻어올
수 있는가?
» 간접 지정 연산자(*)
» 포인터 변수가 가리키는 위치의 값을 얻어오는 연산자

포인터에서 사용되는 "*"의 의미
 선언 시의 "*" : 변수가 포인터 변수라는 것을 알려준다.
 활용 시의 "*" : 간접 지정 연산자의 역할
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
8
포인터의 개념

포인터 변수 활용 예









01 #include <stdio.h>
02 void main(){
03
char c = 'x'; // 일반 변수 선언과 초기화
04
char *cp;
// 포인터 변수 선언
05
cp = &c;
// 주소 연산자를 이용해 변수 c의 주소 cp에 할당
06
// 간접 지정연산자를 이용해 cp가 가리키는 데이터 값 출력
07
printf(" 포인터 주소 cp 가 가리키는 데이터 값 : %c \n", *cp); //간접지정 연산자 사용
08 }
사용되는 메모리 구조
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
9
포인터의 개념

다중 포인터
 포인터에 대한 포인터
 포인터가 다른 포인터의 주소를 가리키는 구조
 이론적으로 여러 개의 포인터들이 서로 연결될 수 있지만 주로 두
개의 포인터로 구성된 이중 포인터 형식이 많이 사용됨

이중 포인터에 대한 선언
 형식 : [데이터 형] **[포인터 변수명];
이중 포인터변수와
메모리 관계
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
10
포인터의 개념

이중 포인터의 활용 예

01 #include <stdio.h>

02 void main(){

03
int x, *px, **ppx;

04
x = 10;

05
px = &x;

06
ppx = &px;

07
printf("x의 값 : %d \n", x);

08
printf("px가 가리키는 값 : %d \n", *px);

09
printf("ppx에 저장된 주소 값 : %x \n", *ppx);

10
printf(ppx가 가리키는 주소가 가리키는 값 : %d \n", **ppx);

11 }

x와 *px 그리고 **ppx의 관계

출력 결과
 x
10
= ____________
*px
= ____________
10
px의 주소 **ppx = ____________ 10
 *ppx = ____________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
11
[기초다지기] 포인터 개념 익히기


1. 포인터 변수와 주소지정 연산자 이용하기
분석
#include <stdio.h>
void main(){
c의 주소는 12FF7C이고 값은 A이다.
char c = 'A';
value의 주소는 12FF78이고 값은 20이다.
int value = 20;
char *cp;
int *ip;
cp = &c;
ip = &value;
printf(" c의 주소는 %X 이고 값은 %c 이다. \n",cp, *cp);
printf(" value의 주소는 %X 이고 값은 %d 이다. \n",ip, *ip);
}
 문자형 변수 c나 정수형 변수 value의 주소는 & 연산자를 통해 얻음
 변수의 주소값
– cp = &c와 ip = &value
 cp와 ip는 변수의 형에 대한 포인터 변수로 char *cp 그리고 int *ip로 선언
 printf 함수에서 포인터 변수의 주소 출력 : %X(16진수 표기)
 printf 함수에서 사용되는 *cp에서 *
– 간접 지정 연산자로 cp주소가 가리키고 있는 값을 가져온다
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
12
[기초다지기] 포인터 개념 익히기

2. 이중 포인터 활용하기
#include <stdio.h>
두 수를 입력하시오 : 9 7
void main(){
또다른 두 수를 입력하시오 : 34 10
int i,j,x,y;
네 수 중 가장 큰 수는 34입니다.
int *ip, *xp, **ipp;
printf(" 두 수를 입력하시오 : ");
scanf("%d%d",&i,&j);
ip = (i>j) ? &i : &j;
printf(" 또 다른 두 수를 입력하시오 : " );
scanf("%d%d",&x,&y);
xp = (x>y) ? &x : &y;
if(*ip > *xp){
ipp = &ip;
}else{
ipp = &xp;
}
printf(" 네 수 중 가장 큰 수는 %d입니다. \n", **ipp);
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
13
[기초다지기] 포인터 개념 익히기

2. 이중 포인터 활용하기

분석
 이중 포인터
– 포인터 변수에 대한 주소를 가진 변수
– 포인터에 대한 포인터로 인식
 프로그램은 4개의 수 중 가장 큰 수를 포인터를 이용하여 얻어옴
 일반변수 i,j,x,y, 포인터 변수 ip, xp, 이중 포인터 변수 ipp 선언
 처리과정
– 첫 번째 scanf를 통해 두 수를 입력 받아 큰 값을 가진 변수의 주소를
ip에 할당
– 두 번째 scanf에서도 두개의 변수를 입력받고 큰 수를 가진 변수의
주소를 xp에 저장
– 그 다음 if문을 통해 ip가 가리키는 값(*ip)와 xp가 가리키는 값(*xp)를
비교하여 큰 값을 가리키고 있는 포인터 변수를 ipp에 저장
– 마지막으로 printf함수에서 두개의 간접지정 연산자(**ipp)를 통해 ipp가
가리키는 주소의 포인터 변수가 가리키는 값 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
14
예습시간 – 2 교시
배열과 포인터 그리고 연산자
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
15
배열과 포인터 그리고 연산자

학습 개요





포인터와 배열의 연관관계에 대해 알아본다.
포인터 조작을 위한 연산자들에 대해 알아본다.
이차원 배열과 포인터의 관계를 이해한다.
문자열 배열과 포인터의 관계를 이해한다.
포인터 배열에 대해 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
16
배열과 포인터 그리고 연산자

배열과 포인터
 배열과 포인터는 서로 밀접한 연관관계를 가지고 있기 때문에
필요에 따라 이들을 교환하여 사용할 수 있다.
 배열
– 동일한 유형의 데이터들이 기억장소에 순차적으로 저장된 형태
– 배열의 대표 명은 배열의 시작 주소
 배열에 대한 포인터 변수 할당 예
– 01 int *pArray, array[5] = {1,2,3,4,5};
– 02 pArray = array;
 메모리 구조
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
17
배열과 포인터 그리고 연산자

포인터 조작 연산자
 포인터의 사용목적
– 주소 조작을 보다 편리하기 사용하기 위해
 포인터 조작 연산자
– 포인터 변수를 대상으로 수행되며 주소 값의 변화를 제공
– 주소에 대한 덧셈과 뺄셈 연산만이 사용 가능하다.
– 포인터 값의 1 증가는 실제 데이터 타입의 크기만큼 증가가 이루어짐
 연산자 종류와 사용형태 그리고 메모리와의 관계
연산자
설명
사용 예
+
덧셈
-
메모리 주소 (p 값 100번지라고 가정)
char(1)
short(2)
int(4)
double(8)
p=p+2
102(p+1*2)
104(p+2*2)
108(p+4*2)
116(p+8*2)
뺄셈
p=p-2
98
96
92
84
++
l증가
p++ , ++p
101
102
104
108
--
1감소
p-- , --p
99
98
96
92
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
18
배열과 포인터 그리고 연산자

포인터 조작 연산자 사용 예











01 #include <stdio.h>
02 void main(){
03
static int array[5]={1,2,3,4,5};
04
int *pArray;
출력
05
int i;
06
pArray = array;
07
for(i=0;i<5;i++){
08
printf("array[i] = %d \n",*pArray);
09
pArray = pArray + 1;
10
}
11 }
12345
결과 :_____________
포인터 변수와 배열의
메모리 관계
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
19
배열과 포인터 그리고 연산자

이차원 배열과 포인터
 이차원 배열은 행렬로 표현되며 포인터 변수를 통해 조작 가능
 활용 예
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
01 #include <stdio.h>
02 void main(){
03
static int data[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
04
int *p, i;
05
p = data;
06
// 첫 번째 행의 값 출력
07
printf("첫 번째 행의 값은 : ");
08
for(i=0; i<4; i++){
09
printf("%5d",*p++);
출력결과 : 첫 번째 행의 값은 : 1 2 3 4
10
}
세 번째 행위 값은 : 9 10 11 12
11
//세 번째 행의 값 출력
12
printf("\n세 번째 행의 값은 : ");
13
p = data[2];
14
for(i=0; i<4;i++){
15
printf("%5d",*p++);
16
}
17
printf("\n");
18 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
20
배열과 포인터 그리고 연산자

이차원 배열과 포인터
 프로그램에 대한 메모리 구조
p = data; 일 경우 포인터 변수 p와 data의 관계
p == data == data[0] == &data[0][0] == 1940번지
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
21
배열과 포인터 그리고 연산자

문자열 배열과 포인터
 문자열 배열 역시 포인터를 통해 조작 가능한다.
 사용 예>
–
–
–
–
–
–
–
–
–
01 #include <stdio.h>
출력
02 void main(){
03
char greeting[] ="Hi everyone!";
04
char *cp;
05
cp = greeting;
06
printf("%s\n",cp);
07
cp=cp+3;
08
printf("%s\n",cp);
09 }
결과 : Hi everyone!
everyone!
변수들의 메모리 관계
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
22
배열과 포인터 그리고 연산자

포인터 배열




포인터
포인터
문자열
문자열
변수를 배열로써 관리
변수들을 집단으로 관리하는 상황에서 자주 사용됨
배열 관리를 위해 주로 이용됨
배열의 사용 예
– static char menu[][8] = {"File", "Open", "Save As"};
– 메모리 구조
– 문제점
» 문자열 구성 요소 중 상대적으로 큰 문자열이 존재할 경우 메모리 낭비
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
23
배열과 포인터 그리고 연산자

포인터 배열
 포인터 배열의 사용 예
– static char *pmenu[]={"File", "Open", "Save As"};
– 메모리 구조
– 문자열을 가리키는 주소를 저장하는 1차원 배열
– 각각의 배열 요소는 독립적인 공간을 가진 문자열 주소를 저장
– 문자열 배열에 비해 메모리 낭비를 줄인다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
24
[기초다지기] 배열과 포인터 관계 이해

1. 1차원 배열과 포인터관계
#include <stdio.h>
void main(){
static int iarray[]={10,20,30,40,50,60};
static char carray[] = "FILE";
int *ip, i;
char *cp;
ip = iarray;
for(i = 0; i<6; i++){
printf("ip 주소 : %u , 정수값 : %d \n", ip, *ip);
ip++;
}
for(cp = carray; *cp != '\0'; cp++){
printf("cp 주소 : %u , 문자열 : %s \n", cp, cp);
}
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
ip 주소 : 4344368 , 정수값 : 10
ip 주소 : 4344372 , 정수값 : 20
ip 주소 : 4344376 , 정수값 : 30
ip 주소 : 4344380 , 정수값 : 40
ip 주소 : 4344384 , 정수값 : 50
ip 주소 : 4344388 , 정수값 : 60
cp 주소 : 4344392 , 문자열 : FILE
cp 주소 : 4344393 , 문자열 : ILE
cp 주소 : 4344394 , 문자열 : LE
cp 주소 : 4344395 , 문자열 : E
25
[기초다지기] 배열과 포인터 관계 이해

2. 이차원 배열과 포인터 활용
#include <stdio.h>
void main(){
static int array[][4] = {{10,20,30,40},{50,60,70,80}};
int temp[4];
int *ip, *jp, *tp;
int i,j;
ip = array[0];
jp = array[1];
0 행 : 50 60 70 80
tp = temp;
1 행 : 10 20 30 40
for(i=0;i<4;i++){
*tp = *ip;
*ip = *jp;
*jp = *tp;
tp++;ip++;jp++;
}
for(i=0;i<2;i++){
printf(" %d 행 : ", i);
for(j=0;j<4;j++){
printf("%5d",array[i][j]);
}
printf("\n");
}
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
26
[기초다지기] 배열과 포인터 관계 이해

3. 포인터 배열에 대해 이해하자.
#include <stdio.h>
void main(){
static char *pmenu[]={"File","Open","Save As"};
char **mpp;
int i;
== File Menu ==
mpp = pmenu;
File
i=0;
Open
printf("== File Menu ==\n");
Save As
while(i < 3){
printf(" %s \n", *mpp);
mpp++;
i++;
}
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
27
예습시간 – 3 교시
메모리 동적 할당 함수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
28
메모리 동적 할당 함수

학습 개요
 동적인 메모리 관리에 대해 이해한다.
 메모리의 동적 할당 관련 함수들에 대해 알아본다.
–
–
–
–
calloc 함수
malloc 함수
free 함수
realloc 함수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
29
메모리 동적 할당 함수

메모리 동적 할당 함수 개요
 주 기억 장치 구조
– 정적인 데이터 정보 저장 공간 (Heap)
» 전역 변수나 정적 변수 등의 저장 공간
» 프로그램 수행 시 항상 존재하는 변수 저장
– 임시 데이터 정보 저장 공간 (Stack)
» 지역 변수
» 프로그램 수행 도중 임시적으로 발생되는 변수 저장 공간
 메모리 동적 할당
– 실행도중 메모리 공간을 할당하여 사용
– 힙(Heap)영역을 이용한 메모리 할당
 동적 메모리 할당 관련 함수 헤더파일
– 동적 메모리 관련 함수 정보
– #include <stdlib.h>
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
30
메모리 동적 할당 함수

calloc 함수
 배열을 저장할 크기의 기억 장소를 할당하고 할당된
주소를 리턴 한다.
 함수의 원형
– void *calloc(size_t num, size_t size);
»
»
»
»
size_t 타입 :unsigned int 타입을 재정의
num : 생성할 배열의 수
size : 요소의 크기
반환 결과 : 정상적일 경우 할당된 주소 비정상적인 경우 NULL
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
31
메모리 동적 할당 함수

calloc 함수 활용 예


















01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h> // calloc 함수 사용 목적
void main(){
int *p;
//포인터 변수
int *tp,i;
//임시 포인터 와 변수 // 할당된 포인터 주소는 타입 변환(int *) 후 p에 할당
p = (int *)calloc(10,sizeof(int)); // 정수형 10개의 배열을 가진 공간 할당 후 주소 값 전달
if(p!=NULL){ // 정상적인 할당 여부 확인
tp = p;
for(i=0;i<10;i++){
*tp++ = i; //tp가 가리키는 공간에 i 값 할당 후 주소 1증가(주소: tp + int 크기)
}
tp = p;
for(i=0;i<10;i++){
printf("%5d",*tp++); 출력 결과 : 0 1 2 3 4 5 6 7 8 9
}
printf("\n");
}
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
32
메모리 동적 할당 함수

malloc 함수
 하나의 데이터 크기에 대한 기억장소 할당
 함수의 원형
– void *mallic(size_t size);
» size : 데이터의 크기
 사용 예
–
–
–
–
–
–
–
–
–
–
01
02
03
04
05
06
07
08
09
10
#include <stdio.h>
#include <stdlib.h>
void main(){
double *p;
//포인터 변수
p = (double *)malloc(sizeof(double)); // double 크기의 공간 확보
if(p!=NULL){
*p = 3.1415913;
출력 결과 :3.1416
printf("p의 값 : %.4f \n",*p);
}
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
33
메모리 동적 할당 함수

calloc와 malloc 관계
 둘 다 메모리의 공간을 할당하는 함수
 인자의 형태가 다르다.
– calloc 함수
– malloc 함수
: 배열형 할당
: 데이터형 할당
 인자의 형태가 다르지만 메모리 공간 할당 행위는 동일하다.
 malloc 함수를 이용해 calloc 함수와 동일한 공간을 할당 가능하다.
– p1 = (int *) calloc(10,sizeof(int));
– p2 = (int *) malloc(sizeof(int)*10);
 p1과 p2는 둘다 정수형 10개의 배열 공간을 할당하고 있다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
34
메모리 동적 할당 함수

기타 함수
 free 함수
– 할당된 메모리 공간 해제 함수
– 동적 메모리를 통해 할당된 기억공간은 더 이상 사용하지 않을
경우 반드시 그 메모리 공간을 해제하여 주어야 한다.
– 기억 공간이 해제 후 다른 프로그램에서 이 공간을 사용할 수
있다.
– 함수의 원형
» void free(void *ptr)
 이전 calloc나 malloc을 통해 할당받은 주소를 free 함수에 전달
– 사용 예 >
»
»
»
»
01
02
03
04
05
» 06
» 07
...
int *p;
p = (int *)malloc(sizeof(int));
if(p!=NULL){
...
free(p);
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
35
메모리 동적 할당 함수

기타 함수
 realloc 함수
– 이미 할당된 메모리 공간을 늘리거나 줄일 경우에 사용
– 기존에 존재하는 데이터는 보존
– 함수의 원형
» void *realloc(void *ptr, size_t size);
 ptr : 이전에 할당된 메모리 주소
 size : 새롭게 할당할 메모리 크기
– 사용 예
»
»
»
»
»
01
02
03
04
05
char *cp;
cp = (char *)malloc(10);
strcpy(cp,"hi there");
cp = (char *)realloc(20);
...
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
36
[기초다지기] 메모리와 동적 할당 함수

1. calloc 함수 활용하기
#include <stdio.h>
#include <stdlib.h>
void main(){
데이터의 크기를 입력하시오 : 5
int count,i;
5 개의 데이터를 입력하시오 : 3.4 54.2 67.3 55.4 21.8
float *fp,*tp;
결과 :
3.40 54.20 67.30 55.40 21.80
printf("데이터의 크기를 입력 하시오 : ");
scanf("%d",&count);
fp = (float *)calloc(count,sizeof(float));
if(fp == NULL){
printf("메모리가 할당되지 않았습니다.\n");
return;
}
tp = fp;
printf(" %d 개의 데이터를 입력 하시오 : ",count);
for(i=0; i <count ; i++){
scanf("%f",tp);
tp++;
}
printf("결과 : ");
tp = fp;
for(i=0; i<count ; i++){
printf("%8.2f",*tp++);
}
printf("\n");
free(fp);
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
37
[기초다지기] 메모리와 동적 할당 함수

2. malloc와 realloc 함수 활용
#include <stdio.h>
Hi
#include <stdlib.h>
더 입력할 문자열이 있습니까? (Y/N) : Y
everyone!
#include <string.h>
더 입력할 문자열이 있습니까? (Y/N) : y
void main(){
Welcome
static char buffer[80];
더 입력할 문자열이 있습니까? (Y/N) : n
char *cp, select;
결과 : Hi Everyone! Welcome
int size, tot;
scanf("%s",buffer);
size = strlen(buffer);
scanf("%s",buffer);
cp = (char *)malloc(size+1); // 1은 '\0' 공간
tot = strlen(cp) + 1;
strcpy(cp,buffer);
size = strlen(buffer);
printf("더 입력할 문자열이 있습니까? (Y/N) : ");
cp = (char *)realloc(cp,tot + size + 1);
fflush(stdin);
strcat(cp," ");
scanf("%c",&select);
strcat(cp,buffer);
while(select == 'Y' || select == 'y'){
printf("더 입력할 문자열이 있습니까? (Y/N) : ");
strset(buffer,'\0');
fflush(stdin);
scanf("%c",&select);
}
printf("결과 : %s \n", cp);
free(cp);
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
38
실습시간 – 1 교시
포인터와 관련 연산자 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
39
포인터와 관련 연산자 활용

학습개요
 배열과 포인터 관계를 이해한다.
 포인터를 이용한 배열의 데이터 조작 방법을 다룬다.
 성적 처리 프로그램 작성을 통한 포인터 이해
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
40
포인터와 관련 연산자 활용

성적 처리 프로그램
 문제 정의
– 성적 처리 프로그램을 작성하고자 한다. 학생은 5명이고 과목은
국어, 영어, 수학인 3과목을 대상으로 한다. 학생 별 총점이
필요하고 각 과목당 총점과 평균을 계산할 필요가 있다. 성적의
값은 정수 값으로 입력되어지고 평균은 실수(double)값으로
처리한다. 이 프로그램을 포인터를 이용하여 작성하시오.
 입/출력 조건
– 입력 조건
» 5명의 학생에 대한 국어, 영어, 수학 점수
» 100점을 기준으로 입력한다.
– 출력 조건
» 각 개인별 성적 리스트와 총점
» 과목별 총점과 평균 데이터
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
41
포인터와 관련 연산자 활용
 성적 테이블 출력 형식
******************************************
번호 국어 영어 수학 총점
******************************************
1
XXX XXX XXX XXX
2
XXX XXX XXX XXX
3
XXX XXX XXX XXX
4
XXX XXX XXX XXX
5
XXX XXX XXX XXX
******************************************
과목총점
XXX XXX XXX XXX
******************************************
과목평균
X.XX X.XX X.XX X.XX
******************************************
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
 실행 후 결과 형식
42
포인터와 관련 연산자 활용
 관련 함수 및 식
–
–
–
–
–
–
(1)
(2)
(3)
(4)
(5)
(6)
성적은 scores[6][5] 크기의 배열로 관리한다.
평균데이터는 aves[5] 크기의 배열로 관리한다.
총점은 개인별 국어, 영어, 수학 점수의 합이다.
과목총점은 과목당 학생들이 취득한 점수의 합이다.
과목평균은 과목총점은 /학생수로 나눈 값이다.
배열에 데이터 값 처리와 할당을 위해 포인터변수를 활용한다.
 알고리즘 (또는 플로우차트)
– 1. 5명의 학생에 대한 국어, 영어, 수학 점수 입력
– 2. 데이터 값 처리
» 2.1. 개인별 총점 처리
» 2.2 과목별 총점 처리
» 2.3 과별별 평균 처리
– 3. 처리정보 출력
»
»
»
»
3.1
3.2
3.3
3.4
타이틀 출력
개인별 정보 출력(개인 총점 포함)
과목총점 출력
과목평균 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
43
포인터와 관련 연산자 활용

프로그램 작성
 1 단계
– 216페이지의 프로그램을 알고리즘을 참조하여 빈 곳을 채워
넣고 프로그램을 완성한 후 score.c 이름으로 저장하자.
①.
②.
③.
④.
⑤.
⑥.
ps+1,ps+2,ps+3
scores[i]
*(ps+j)
*(++pa) = (*(++ps))/5.0
titles[i]
*ps++
 2 단계
– 프로그램이 정상적으로 작동하는지를 확인 한 후 다음 입력에
대한 출력 결과를 작성하자.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
44
포인터와 관련 연산자 활용
– 1. 디버깅 환경에서 다음 포인터 변수의 주소를 확인하자.
» 42라인의 ps가 저장하고 있는 주소 값 : ____________________
» 43라인의 pa가 저장하고 있는 주소 값 : ____________________
– 2. 입력 결과에 대한 출력 값 확인
입력 조건
출력 결과
번호
국어
영어
수학
1
95
86
83
2
93
67
99
3
75
48
68
4
97
96
95
5
93
78
86
번호
국어
영어
수학
1
78
87
55
2
68
97
65
3
99
97
94
4
69
88
76
5
91
93
76
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
개인별 총점 :
264, 259, 191, 288, 257
과목별 총점 :
453, 375, 431, 1259
과목별 평균 :
90.60, 75.00, 86.20, 251.80
개인별 총점 :
과목별 총점 :
과목별 평균 :
45
실습시간 – 2 교시
동적 메모리 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
46
동적 메모리 활용

학습개요




메모리 동적 할당 방법을 익힌다.
동적 할당 함수를 이용한 메모리 활용 기법을 다룬다.
1교시의 정적 배열 구조를 동적 할당 방법으로 변환한다.
정렬 문제를 다룬다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
47
동적 메모리 활용

동적 할당을 이용한 성적처리 프로그램
 문제 정의
– 실습 1에서 포인터를 이용한 성적 처리 프로그램을 작성해 보았다.
그러나 학생들의 수가 변화되는 상황에서는 항상 프로그램을
수정하여야 한다. 그 결과 학생 수의 변화에 대응할 수 있는 프로그램
작성이 요구사항에 추가되었다. 또한 처리 결과를 학생들의 총점을
이용해 내림차순으로 정렬하여 출력하고 싶다. 이러한 조건을 만족하는
프로그램을 작성하여라. 이 프로그램은 동적 메모리 할당과 포인터를
이용해 구현하여라.
 입/출력 조건
– 입력 조건
» 입력하고자 하는 학생의 수
» 학생 수에 대한 국어, 영어, 수학 점수 , 100점을 기준으로 입력한다.
– 출력 조건
» 각 개인별 성적 리스트와 총점
» 과목별 총점과 평균 데이터 , 총점으로 정렬된 성적 테이블
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
48
동적 메모리 활용
 출력 형식
******************************************
번호 국어 영어 수학 총점
******************************************
3
XXX XXX XXX 290
1
XXX XXX XXX 270
4
XXX XXX XXX XXX
2
XXX XXX XXX 196
******************************************
과목총점
XXX XXX XXX XXX
******************************************
과목평균
X.XX X.XX X.XX X.XX
******************************************
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
 입/출력 화면
49
동적 메모리 활용
 관련 함수 및 식
–
–
–
–
–
–
–
–
–
–
(1) 동적 메모리 관련 함수는 stdlib.h 파일에 정의되어 있다.
(2) 동적 메모리 할당 함수 : calloc(), malloc()
(3) 동적 메모리 해제 함수 : free()
(4) 성적은 pRow 라는 포인터로 관리한다.
(5) 과목별 총점은 pTot로 평균은 pAves 포인터로 관리한다.
(6) 총점은 개인별 국어, 영어, 수학 점수의 합이다.
(7) 과목총점은 과목당 학생들이 취득한 점수의 합이다.
(8) 과목평균은 과목총점은 /학생수로 나눈 값이다.
(9) 정렬은 개인별 총점을 기준으로 내림차순 정렬한다.
(선택 정렬 알고리즘 사용)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
50
동적 메모리 활용
 프로그램에서 사용되는 메모리 할당 구조
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
51
동적 메모리 활용
 알고리즘 (또는 플로우차트)
– 1. 입력 설계
» 1.1 성적 처리 대상 학생 수를 입력한다.
» 1.2 성적 처리에 필요한 메모리 공간을 할당한다.
» 1.3 대상 학생들의 국어, 영어, 수학 점수 입력
– 2. 데이터 값 처리
» 2.1. 개인별 총점 처리
» 2.2 과목별 총점 처리
» 2.3 과목별 평균 처리
– 3. 개인별 총점을 기준으로 내림차순 정렬
– 4. 처리정보 출력
»
»
»
»
4.1
4.2
4.3
4.4
타이틀 출력
개인별 정보 출력(개인 총점 포함)
과목총점 출력
과목평균 출력
– 5. 동적 메모리 공간 해제
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
52
동적 메모리 활용

프로그램 작성
 1 단계
– 223페이지의 프로그램을 위의 알고리즘을 분석하여 빈 부분을
채우고 프로그램을 작성한 후 sortedScore.c파일로 저장하자.
①. (int *)calloc(num,sizeof(int))
②. (double *) malloc(sizeof(double)*5)
③. *(pRow+i)
④. ps = *(pRow+j);
⑤. sub += *(ps+i);
⑥. *(++pa) = (*(++ps))/(double)num
⑦. free(pAves)
⑧. free(*(pRow+i))
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
53
동적 메모리 활용
 2 단계
– 프로그램이 정상적으로 동작 시 아래의 입력에 대한 결과를 작성하자.
입력 조건
출력 결과
성적처리대상 학생수 : 5
각 학생별
입력점수
번호
국어
영어
수학
1
95
86
83
2
93
67
99
3
75
48
68
4
97
96
95
5
93
78
86
개인별 총점 :
264, 259, 191, 288, 257
과목별 총점 :
453, 375, 431, 1259
과목별 평균 :
90.60, 75.00, 86.20, 251.80
내림차순 정렬 결과 :
번호 : 4, 1, 2, 5, 3
개인별 총점 :
성적처리대상 학생수 : 6
각 학생별
입력점수
번호
국어
영어
수학
1
88
60
58
2
78
97
65
3
94
96
94
4
79
98
76
5
91
93
86
6
54
66
79
과목별 총점 :
과목별 평균 :
내림차순 정렬 결과 :
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
54
포인터
The End.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
55