Rylah's Study & Daily Life
07. 포인터 (Pointer) 본문
#include <stdio.h>
int main(void) {
//포인터
//[철수] : 101호
//[영희] : 201호
//[민수] : 301호
// 각 문앞에 '암호'가 걸려있음
int 철수 = 1; // 암호
int 영희 = 2;
int 민수 = 3;
printf("철수네 주소 : %d , 암호 : %d\n", &철수, 철수);
printf("영희네 주소 : %d , 암호 : %d\n", &영희, 영희);
printf("민수네 주소 : %d , 암호 : %d\n", &민수, 민수);
// 미션맨!
// 첫번째 미션 : 아파트의 각 집에 방문해서 문에 적힌 암호를 확인
int * 미션맨; // 포인터 변수
미션맨 = &철수;
printf("미션맨의 방문하는 곳의 주소는 ? : %d, 암호는 ? : %d\n", 미션맨, *미션맨);
미션맨 = &영희;
printf("미션맨의 방문하는 곳의 주소는 ? : %d, 암호는 ? : %d\n", 미션맨, *미션맨);
미션맨 = &민수;
printf("미션맨의 방문하는 곳의 주소는 ? : %d, 암호는 ? : %d\n", 미션맨, *미션맨);
// 두번째 미션 각 암호에 3을 곱해라
미션맨 = &철수;
*미션맨 = *미션맨 * 3;
printf("미션맨의 암호를 바꾼 곳의 주소는 ? : %d, 암호는 ? : %d\n", 미션맨, *미션맨);
미션맨 = &영희;
*미션맨 = *미션맨 * 3;
printf("미션맨의 암호를 바꾼 곳의 주소는 ? : %d, 암호는 ? : %d\n", 미션맨, *미션맨);
미션맨 = &민수;
*미션맨 = *미션맨 * 3;
printf("미션맨의 암호를 바꾼 곳의 주소는 ? : %d, 암호는 ? : %d\n", 미션맨, *미션맨);
// 스파이
// 미션맨이 바꾼 암호에서 2를 빼라!
int* 스파이 = 미션맨;
printf("\n....스파이가 미션을 수행하는 중 .......\n\n");
스파이 = &철수;
*스파이 = *스파이 - 2; // 철수 = 철수 - 2;
printf("스파이가 방문하는 곳의 주소는 ? : %d, 암호는 ? : %d\n", 스파이, *스파이);
스파이 = &영희;
*스파이 = *스파이 - 2; //
printf("스파이가 방문하는 곳의 주소는 ? : %d, 암호는 ? : %d\n", 스파이, *스파이);
스파이 = &민수;
*스파이 = *스파이 - 2;
printf("스파이가 방문하는 곳의 주소는 ? : %d, 암호는 ? : %d\n", 스파이, *스파이);
printf("\n...철수 영희 민수는 집에 오고서는 바뀐 암호를 보고 깜놀...\n\n");
printf("철수네 주소 : %d , 암호 : %d\n", &철수, 철수);
printf("영희네 주소 : %d , 암호 : %d\n", &영희, 영희);
printf("민수네 주소 : %d , 암호 : %d\n", &민수, 민수);
// 참고로, 미션맨이 사는 곳의 주소는 &미션맨으로 확인
printf("미션맨의 주소는 : %d\n", &미션맨);
printf("스파이의 주소는 : %d\n", &스파이);
return 0;
}

#include <stdio.h>
int main(void) {
// 배열 ?
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));
}
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]);
return 0;
}

#include <stdio.h>
void swap(int a, int b);
void swap_addr(int* a, int* b);
int main(void) {
int a = 20;
int b = 40;
printf("a의 주소 : %d\n", &a);
printf("b의 주소 : %d\n", &b);
printf("a : %d\n b : %d\n", a, b);
printf("--------- Swap ------------\n");
swap(a, b);
swap_addr(&a, &b);
printf("\na : %d, b : %d\n", a, b); // 값이 그대로
// 값에 의한 복사 (Call-by-Value) -> 값만 복사한다는 의미
//주소값을 넘기면? -> 메모리 공간에 있는 주소 값 자체를 넘기게 되면 ..
printf("(주소값 전달) a의 주소 : %d\n", &a);
printf("(주소값 전달) b의 주소 : %d\n", &b);
return 0;
}
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;
}
void swap_addr(int* a, int* b) {
printf("Swap 함수 내의 a의 주소 : %d\n", a);
printf("Swap 함수 내의 b의 주소 : %d\n", b);
int temp = *a;
*a = *b;
*b = temp;
printf("\n(주소값 전달) Swap 함수 내부 => a : %d, b : %d", *a, *b);
}

#include <stdio.h>
void changeArray(int* ptr);
int main(void) {
//배열일 때 arr2 -> 주소
int arr2[3] = { 10, 20, 30 };
//changeArray(arr2);
changeArray(&arr2[0]);
for (int i = 0; i < 3; i++) {
printf("Array[%d] : %d\n", i, arr2[i]);
}
// scanf_s에서 &num과 같이 &를 사용하는 이유는? 주소값에 입력하기 때문
return 0;
}
void changeArray(int* ptr) {
ptr[2] = 50;
}

#include <stdio.h>
#include <time.h>
// 물고기가 6마리가 있어요
// 이들은 어항에 살고 있는데, 사막이에요
// 사막이 너무 더워서 , 너무 건조해서 물이 아주 빨리 증발해요
// 물이 다 증발하기 전에 부지런히 어항에 물을 줘서 물고기를 살려주세요.
// 물고기는 시간이 지날 수록 점점 커져서 나중에는... 냠냠..
int level;
int arrayFish[6];
int* cursor;
void initData();
void printFishes();
void decreaseWater(long elapsedTime);
int main(void) {
long startTime = 0; // 게임 시작 시간 시간은 보통 long
long totalElapsedTime = 0; // 총 경과시간
long prevElapsedTime = 0; // 직전 경과시간 (최근에 물을 준 시간 간격)
int num;// 몇번 물을 줄 것인지 사용자 입력
initData(); // 초기값 입력
cursor = arrayFish; // cursor[0].... cursor[1]
startTime = clock(); // 현재 시간을 millisecond (1000분의 1초로 반환)
while (1) {
printFishes();
//getchar(); // 임시 사용자 입력 대기
printf("몇 번 어항에 물을 주시겠어요? ");
scanf_s("%d", &num);
// 입력값 체크
if (num < 1 || num > 6) {
printf("\n입력 값이 잘못되었습니다.\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. 어항이 물이 아닌 경우 ? > 물을 준다! 100을 넘지 않는지 체크
// 물이 100이 넘지 않아야 됨
else if (cursor[num - 1] + 1 <= 100) {
// 물을 준다.
printf("%d 번 어항에 물을 줍니다.\n\n", num);
cursor[num - 1] += 1; // cursor[num - 1] = cursor[num - 1] + 1;
}
// 레벨업을 할 건지 확인 (레벨업은 20초 마다 한번씩)
if (totalElapsedTime / 20 > level - 1) {
// 레벨업
level++; // level 1 -> level 2 -> level 3
printf("***** 축 레벨업 기존 %d 레벨에서 %d 레벨로 업그레이드\n\n", level - 1, level);
if (level == 5) {
printf("\n\n 축하합니다. 최고 레벨을 달성하였습니다. 게임을 종료합니다.===\n");
exit(0);
}
}
if (checkFishAlive() == 0) { // 물고기 모두 사망
printf("모든 물고기가 죽었습니다. ㅠㅠ 흑흑 ... \n");
exit(0);
}
else {
//최소 한마리 물고기는 살아 있음
printf("물고기가 아직 살아있어요.\n");
}
prevElapsedTime = totalElapsedTime;
// 10초 -> 15초 (5초 : prevElapsedTime -> 15초로 변경) -> 25초 (10초...?)
}
return 0;
}
void initData() {
level = 1;
for (int i = 0; i < 6; i++) {
arrayFish[i] = 100;
}
}
void printFishes() {
printf("%3d번 %3d번 %3d번 %3d번 %3d번 %3d번\n", 1, 2, 3, 4, 5, 6);
for (int i = 0; i < 6; i++) {
printf(" %3d ", 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;
}

'Study > C' 카테고리의 다른 글
09. 구조체 (0) | 2021.11.03 |
---|---|
08. 다차원 배열 (0) | 2021.11.03 |
06. 배열 (Array) (0) | 2021.11.02 |
05. 함수 (0) | 2021.11.02 |
04. 조건 / 분기 (0) | 2021.11.02 |