본문 바로가기
Dev Language/C

C언어 포인터 사용

by 미티치 2016. 11. 11.
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 sizeint **p);        // =>    1-2 방법
int input();
void output(int num, int *p);
 
void main(){
 
    // 예제 2)
    int *= 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 sizeint **p){
    if(*p==NULL)
        *= (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