1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 |
#include<stdio.h>
#include<stdlib.h>
//int* memAssign(int size); // => 1-1 방법
void memAssign(int size, int **p); // => 1-2 방법
int input();
void output(int num, int *p);
void main(){
// 예제 2)
int *p = NULL;
int num;
int i;
num = input();
// p = memAssign(num); // 1-1 방법
memAssign(num, &p); // 1-2 방법
for(i=0;i<num;i++){
*(p+i) = i*100;
}
output(num, p);
free(p); // 메모리 해제
}
/* 1-1. 메모리 할당 함수
int* memAssign(int size){
int *p = NULL;
if(p==NULL)
p = (int*)malloc(sizeof(int)*size);
return p;
}*/
// 1-2. 메모리 할당 함수
void memAssign(int size, int **p){
if(*p==NULL)
*p = (int*)malloc(sizeof(int)*size);
}
// 2. 입력 함수
int input(){
int num;
printf("Num 몇개:");
scanf("%d",&num);
return num;
}
// 3. 출력 함수
void output(int num, int *p){
int i;
for(i=0;i<num;i++){
printf("*p = %d\n",*(p+i));
}
}
// 예제 1)
/*
int *p = NULL; // Null Pointer -> 포인터를 사용하고 있는지 아직 사용하지 않고 있는지 확인할 수 있으므로 이렇게 Null Pointer로 사용하는 것이 안정적이다.
int num,i;
printf("Num 몇개:");
scanf("%d",&num);
// 여기까지 하면 Stack에 *p라는 변수에 NULL, num이라는 변수에 사용자가 입력한 값이 들어가있음 ( *p[NULL], num[ 4 ] ) 이렇게 되어있음
if(p==NULL){
p = (int*)malloc(sizeof(int)*num);
// stack에 있는 *p가 Heap영역에 4byte*4 = 16byte 공간을 만들어 그 공간을 가리킴 ( *p ---> [ 4byte | 4byte | 4byte | 4byte ] )
}
for(i=0;i<num;i++){
*(p+i) = i*100;
}
for(i=0;i<num;i++){
printf("*p = %d\n",*(p+i));
}
free(p); // 메모리 해제
*/ |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 |
#include <stdio.h>
#include<stdlib.h>
void memalloc(char **name,int **score, float **avg); // 포인터의 포인터인 **형을 선언할 때도 타입은 char, float으로 맞춰줌
void input(char *name,int *score);
void oper(int *score, float *avg);
void output(char *name,int *score, float *avg);
void main(){
char *name;
int *score;
float *avg;
memalloc(&name, &score, &avg); // 1. 동적할당 함수
input(name, score); // 2. 성적입력 함수
oper(score, avg); // 3. total과 avg 계산 함수
output(name, score, avg); // 4. 예쁘게 출력해주는 함수
}
// 1. 동적할당 함수
void memalloc(char **name,int **score, float **avg){
*name = (char*)malloc(sizeof(char)*10); // 이름을 10글자 까지 저장할 수 있도록 여유있게 설정
*score = (int*)calloc(4,sizeof(int)); // malloc으로 잡으면 초기화 안한 상태에서 쓰레기 값이 들어가기 때문에 calloc으로 바꿔줌 (calloc은 0으로 초기화됨)
*avg = (float*)malloc(sizeof(float));
}
// 2. 성적입력 함수
void input(char *name,int *score){
int i;
printf(" 이름을 입력하세요 : ");
scanf("%s", name);
for( i=0;i<3;i++){
printf(" %d 점수를 입력하세요(1 국어, 2 영어, 3 수학) : ", i+1);
scanf("%d", (score+i));
}
}
// 3. total과 avg 계산 함수
void oper(int *score, float *avg){
int i;
for( i=0;i<3;i++)
*(score+3) += *(score+i); // total 계산
*avg = (float)score[3]/(float)3; // avg 계산
}
void output(char *name,int *score, float *avg){
char scoName[6][10] = {"Name", "KOR", "ENG", "MAT", "Total", "Avg"};
int i;
printf("%s : %s\n",scoName[0], name);
for( i=0;i<4;i++){
printf("%s : %d\n",scoName[i+1], *(score+i));
}
printf("%s : %f\n",scoName[5], *avg);
} |
cs |
'Dev Language > C' 카테고리의 다른 글
C언어 day5 (함수 기초) (0) | 2016.10.10 |
---|---|
C언어 day3,4 (별찍기 예제) (0) | 2016.10.10 |
C언어 day2 (scanf, 삼항연산자) (0) | 2016.10.05 |
C언어 Day1 (자료형, 변수선언) (0) | 2016.10.04 |