*포인터*

2022. 3. 4. 00:35
1
2
3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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
int main(void){
 
    // 포인터
 
    //철수 : 101호 -> 메모리 공간의 주소
    //영희 : 201호
    //민수 : 301호
    //각 문 앞에 '암호'가 다음과 같이 걸려 있음.
    int jame = 1; 
    int piter = 2;
    int mesk = 3;
 
    printf("jame네 주소 : %d, 암호 : %d\n", &jame, jame);
    printf("piter네 주소 : %d, 암호 : %d\n", &piter,piter );
    printf("mesk네 주소 : %d, 암호 : %d\n", &mesk, mesk);
 
 
    // 미션맨 !
 
    // 첫 번째 미션 : 아파트의 각 집에 방문하여 문에 적힌 암호 확인
    
    int * missionman; //포인터 변수
 
    missionman = &jame;
    printf("미션맨이 방문하는 곳의 주소 : %d, 암호 : %d\n", missionman, * missionman);
 
    missionman = &piter;
    printf("미션맨이 방문하는 곳의 주소 : %d, 암호 : %d\n", missionman, * missionman);
 
    missionman = &mesk;
    printf("미션맨이 방문하는 곳의 주소 : %d, 암호 : %d\n", missionman, * missionman);
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
    // 두 번째 미션 : 각 암호에 3을 곱해라
    
    missionman = &jame;
    *missionman = *missionman * 3;
 
    printf("미션맨이 암호를 바꾼 곳의 주소 : %d, 암호 : %d\n", missionman, * missionman);
 
    missionman = &piter;
    *missionman = *missionman * 3;
 
    printf("미션맨이 암호를 바꾼 곳의 주소 : %d, 암호 : %d\n", missionman, * missionman);
 
    missionman = &mesk;
    *missionman = *missionman * 3;
 
    printf("미션맨이 암호를 바꾼 곳의 주소 : %d, 암호 : %d\n", missionman, * missionman);
 
    // 스파이
 
    // 미션맨이 바꾼 암호에서 2를 빼라 !
 
    int * spy = missionman;
 
    printf("\n.......스파이가 미션 수행하는 중 ......\n");
    spy = &jame;
    *spy = *spy -2; // jame = jame -2;와 같은 문장
    printf("스파이가 방문하는 곳 주소 %d, 암호 : %d\n", spy, * spy);
 
    spy = &piter;
    *spy = *spy -2;
    printf("스파이가 방문하는 곳 주소 %d, 암호 : %d\n", spy, * spy);
 
    spy = &mesk;
    *spy = *spy -2;
    printf("스파이가 방문하는 곳 주소 %d, 암호 : %d\n", spy, * spy);
 
    printf("\n ... jame piter mesk는 집에 와서 바뀐 암호를 보고 깜놀 ...\n");
    printf("jame네 주소 : %d, 암호 : %d\n", &jame, jame);
    printf("piter네 주소 : %d, 암호 : %d\n", &piter,piter );
    printf("mesk네 주소 : %d, 암호 : %d\n", &mesk, mesk);
 
    // 참고 .. 미션맨이 사는 곳의 주소는 .. &missionman으로 확인
 
    printf("미션맨의 주소는 : %d\n", &missionman);
    printf("스파이의 주소는 : %d\n", &spy);
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
 
    // 배열
 
    int arr[3= { 51015};
    
    int * ptr = arr;
    for (int i = 0; i<3; i++){
        printf("배열 arr[%d]의 값 : %d\n ", i, arr[i]);
    }
 
    for (int i = 0; i<3; i++){
        printf("포인터 ptr[%d]의 값 : %d\n ", i, ptr[i]);
    }
    ptr[0= 100;
    ptr[1= 200;
    ptr[2= 300;
 
    for (int i = 0; i<3; i++){
        // printf("배열 arr[%d]의 값 : %d\n ", i, arr[i]);
        printf("배열 arr[%d]의 값 : %d\n ", i, *(arr +i)); // arr은 arr 배열의 주소값을 가지고 있고 i는 그 주소의 i 번째 값 의미.
    }
 
    for (int i = 0; i<3; i++){
        // printf("포인터 ptr[%d]의 값 : %d\n ", i, ptr[i]);
        printf("포인터 ptr[%d]의 값 : %d\n ", i, *(ptr +i));
    }
    // *(arr + i) == arr[i] 똑같은 표현
    // arr == arr 배열의 첫 번째 값의 주소와 동일 == &arr[0]
    printf("arr 자체의 값 : %d\n", arr);
    printf("arr[0]의 주소 %d\n: "&arr[0]);
 
    printf("arr 자체의 값이 가지는 주소의 실제 값 : %d\n"*arr); // * (arr + 0)과 똑같음
    printf("arr[0]의 실제 값 : %d\n"*&arr[0]);
 
    // *& 를 같이 사용하면 아무것도 없는 것과 같다. &은 주소이며, *은 그 주소의 값이기 때문에 붙어있으면 상쇄된다.
 
    printf("arr[0] 의 실제 값 : %d\n"*&*&*&*&*&*&*&*&*&*&arr[0]);
    printf("arr[0] 의 실제 값 : %d\n", arr[0]);
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
    // swap
 
    int a = 10;
    int b = 20;
 
    printf("a의 주소 %d\n", &a);
    printf("b의 주소 %d\n", &b);
    // a와 b의 값 바꾼다.
    printf("Swap 함수 전 => a : %d, b : %d\n", a, b);
    swap(a,b); // 값에 의한 복수 (call by value) -> 값만 복사한다는 의미.
    printf("Swap 함수 후 => a : %d, b : %d\n", a, b);
 
    // 주소값을 넘기면? 메모리 공간에 있는 주소값 자체를 넘기면..
 
    printf("(주소값 전달)Swap 함수 전 => a : %d, b : %d\n", a, b);
    swap_addr(&a,&b);
    printf("(주소값 전달)Swap 함수 후 => a : %d, b : %d\n", a, b);
 
    // 배열일 때, arr2 -> 자체가 주소
    int arr2[3] = { 10, 20, 30};
    //changeArray(arr2);
    changeArray(&arr2[0]);
    for (int i = 0; i < 3; i++){
        printf("%d\n", arr2[i]);
    }
 
    // scanf 에서 &num과 같이 &를 사용하는 이유 !
cs

swap 함수로 주소값 알기

 

 

1
2
3
void swap(int a, int b);
void swap_addr(int * a, int * b);
void changeArray(int * ptr);
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
void swap(int a, int b){
 
    printf(" Swap 함수 내 a의 주소 %d\n"&a);
    printf(" Swap 함수 내 b의 주소 %d\n"&b);
 
    int temp = a;
    a = b;
    b = temp;
 
    printf("Swap 함수 내 => a : %d, b : %d\n", a, b);
}
 
 
void swap_addr(int * a, int * b){
 
    int temp = * a;
    * a = * b;
    * b = temp;
 
    printf("(주소값 전달)Swap 함수 내 => a : %d, b : %d\n"* a, * b);
}
 
void  changeArray(int * ptr){
    ptr[2= 50;
}
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
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
81
82
83
84
85
    // 물고기 키우기 프로젝트
 
    // 물고기 6마리 / 사막에 있는 어항에 살고 있어 물이 빠르게 증말함 / 어항에 물을 주어 물고기들을 살려주세요 ~
 
    long startTime = 0//게임 시작 시간
    long totalElapsedTime = 0// 총 경과 시간
    long prevElapsedTime = 0// 직전 경과 시간 (최근에 물을 준 시간 간격)
 
    int num; // 몇 번 어항에 물을 줄 것인지, 사용자 입력
    initData();
 
    cursor = arrayFish; // cursor[0] ... cursor[1]...
    
    startTime = clock(); // 현재 시간을 millisecond (1000분에 1초) 단위로 변환
 
    while(1){
        printfFishes();
        printf("몇 번 어항에 물을 주시겠어요 ?");
        scanf("%d"&num);
 
        //입력값 체크
        if(num < 1 || num > 6){
            printf("입력값이 잘못 되었습니다\n");
            continue;
        }
 
        // 총 경과 시간
        totalElapsedTime = (clock() - startTime) / CLOCKS_PER_SEC;
        printf("총 경과 시간 : %ld 초 \n", totalElapsedTime);
 
        // 직전에 물을 준 시간 (마지막으로 물 준 시간) 이후로 흐른 시간
        prevElapsedTime = totalElapsedTime - prevElapsedTime;
        printf("최근 경과 시간 : %ld 초 \n", prevElapsedTime);
 
        // 어항의 물을 감소(증발)
 
        decreaseWater(prevElapsedTime);
 
        // 사용자가 입력한 어항에 물을 준다,
        //1, 어항의 물이 0 이면, 물을 주지 않는다. 물고기 다이..
 
        if(cursor[num - 1* 0 ){
            printf("%d 번 물고기는 이미 죽었습니다.. 물을 주지 않습니다.\n", num);            
        }
        //2. 어항의 물이 0이 아닌 경우? 물을 준다 ! 100을 넘지 않는지 체크
 
        else if (cursor[num - 1]+ 1 <= 100){
            //물을 준다
            printf("%d 번 어항에 물을 줍니다. \n\n", num);
            cursor[num-1]+= 1;
        }
 
        //레벨업을 할 건지 20초마다 레벨업 수행
 
        if (totalElapsedTime / 20 > level - 1){
            level ++// level : 1 -> level : 2 .....
            printf("*** 축 레벨업 기존 %d 레벨에서 %d레벨로 업그레이드 ***\n\n", level - 1, level);
            
            //최종 레벨 5
            if(level == 5){
                printf("\n\n 축하합니다. 최고 레벨을 달성하였습니다. 게임을 종료합니다.\n");
                exit(0);
            }
        }
 
        // 모든 물고기가 죽었는지 확인
        
        if (checkFishAlive() == 0){
            printf("모든 물고기가 죽음 \n");
            exit(0);
        }
        else{
            printf("물고기가 아직 살아있어요.\n");
        }
        prevElapsedTime = totalElapsedTime;
 
        // 10초 -> 15초 (5초 : prevDisapsedTime -> 15초로 바꿔주고) -> 25초 (10초..?)
 
 
 
    }
 
    return 0;
 
}
cs

 

 

1
2
3
4
5
6
7
8
void initData();
void printfFishes();
void decreaseWater(long elapsedTime);
int checkFishAlive();
 
int level;
int arrayFish[6];
int * cursor;
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
void initData(){
    level = 1//게임 레벨 (1 ~ 5)
    for (int i = 0; i < 6; i++){
        arrayFish[i] = 100// 어항의 물 높이 (0 ~ 100m 사이)
    }
}
 
void printfFishes(){
    printf("%3d번 %3d번 %3d번 %3d번 %3d번 %3d번\n"123456);
    for (int i = 0; i < 6; i++){
        printf(" %4d ", arrayFish[i]);
    }
    printf("\n\n");
 
}
void decreaseWater(long elapsedTime){
    for (int i = 0 ; i<6; i ++ ){
        arrayFish[i] -= (level * 3 * (int)elapsedTime); // 3. 난이도 조절을 위한 값
        if (arrayFish[i] < 0){
            arrayFish[i] = 0;
        }
    }
}
 
int checkFishAlive(){
    for (int i = 0; i < 6; i++){
        if (arrayFish[i] > 0){
            return 1// 참
        }
    }
    return 0;
}
cs

위 함수 정의.

 

 

 

출처 : https://www.youtube.com/watch?v=q6fPjQAzll8&t=494s

'Programming > C\C++' 카테고리의 다른 글

struct 구조체  (0) 2022.03.04
MultiDimensional Array  (0) 2022.03.04
Initial Array && ASCII  (0) 2022.02.25
functions setting 과 활용  (0) 2022.02.25
if && else if && else 의 활용  (0) 2022.02.23

BELATED ARTICLES

more