Rylah's Study & Daily Life

07. 포인터 (Pointer) 본문

Study/C

07. 포인터 (Pointer)

Rylah 2021. 11. 2. 15:13
#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