*포인터*
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] = { 5, 10, 15};
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", 1, 2, 3, 4, 5, 6);
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 |
위 함수 정의.
'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 |