SECTION 6 ) 포인터
포인터
변수 앞에 &를 붙이면 그 변수가 저장되어있는 메모리공간의 주소를 알 수 있음
포인터 변수 선언 방법 *변수명
포인터 변수의 주소는 &포인터 변수를 통해 알 수 있음
배열과 포인터의 관계
*포인터=배열로 할 경우 똑같은 것이라고 취급 가능
*(arr+i)==arr[i] 똑같은 것 (arr이 배열이라고 할 때)
arr==배열의 첫번째 값의 주소와동일==&arr[0]
즉, arr 자체의 값은 배열의 주소의 실제 값을 의미함
*&는 아무것도 없는 것과 같다. &는 주소이며, *는 그 주소의 값이기 때문에, *&는 서로 상쇄된다
SWAP
값에 의한 복사 (Call by Value) -> 값만 복사한다는 의미
주소에 의한 복사 (Call byReference) -> 값이 아닌 주소를 전달하여 주소를 참조하여 데이터변경 가능
주소값을 넘기면? 메모리 공간에 있는 주소값 자체를 넘기면?
포인터 변수로 주소값을 전달한 후 암호값을 변경!!
여기서 알아보는 scaf의 작동 순서
1. 값을 입력받음.
2. 그 값을 레지스터에 임시로 저장 (* 레지스터란 임시의 저장공간)
3. 변수의 주소로 찾아가 그 주소가 가리키는 메모리에 레지스터에 있는 값(입력한 값)을 저장한다.
4. 레지스터에 있던 값은 지운다.
- 즉, 값을 입력하려면 변수의 주소가 필요하기 때문에& 를 써야한다.
그래서 scanf로 N이란 값을 입력받을 때 scanf("&d",&N) 같이 사용하는 것
#include <stdio.h>
#include <time.h>
int level;
int arrayFish[6];
int * cursor;
void initData();
void printfFishes();
void decreaseWater(long elapsedTime);
int checkFishAlive();
int main(void)
{
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("몇 번 어항에 물을 주시겠어요?\n");
scanf_s("%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");
}
//2.어항의 물이 0이 아닐 경우? 물을 준다 100이 넘지 않는지 체크!!
else if (cursor[num - 1]+1 <= 100)
{
//물을 준다
printf("%d번 어항에 물을 준다\n",num);
cursor[num - 1] += 1;
}
//레벨업을 할 건지 확인(레벨업은 20초마다 한 번 수행)
if (totalElapsedTime/20>level-1 )
{
level++; //
printf("\n레벨업하였습니다 %d에서 %d로\n", level - 1, level);
if (level==5)
{
printf("\n\n......축하합니다.....최고 레벨을 달성하셨습니다\n\n");
printf("게임을 종료합니다\n");
exit(0);
}
}
//모든 물고기가 죽었는지 확인
if (checkFishAlive() == 0)
{
printf("모든 물고기가 사망\n");
exit(0);
}
else
{
printf("물고기가 아직 살아있어요\n");
}
prevElapsedTime = totalElapsedTime;
//for preElapsedTime값 갱신
}
return 0;
}
void initData()
{
level = 1; //게임 레벨 (1-5)
for (int i = 0; i < 6; i++)
{
arrayFish[i] = 100; //어항의 물 높이
}
}
void printfFishes()
{
printf("%3d번 %3d번 %3d번 %3d번 %3d번 %3d번 \n", 1, 2, 3, 4, 5, 6);//&d앞에 숫자는 차지하는 공간
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);
if (arrayFish[i] < 0)
{
arrayFish[i] = 0;
}
}
}
int checkFishAlive()
{
for (int i = 0; i < 6; i++)
{
if (arrayFish[i]>0)
{
return 1;
}
}
return 0;
}
C 프로그래밍 - 입문부터 게임 개발까지 - 인프런
C 는 조금 어렵지만, 아주 기본이 되는 언어입니다. C 를 마스터 하고 나면, 다른 언어는 굉장히 쉽게 배울 수 있습니다. 그리고, 나도코딩이 깜짝! 놀랄만큼 쉽게 알려드리겠습니다. C 프로그래밍
www.inflearn.com
'프로그래밍 공부흔적 > C' 카테고리의 다른 글
[C] 인프런 나도코딩 3일차 S5(배열) (0) | 2020.08.01 |
---|---|
[C] 인프런 나도코딩 2일차 S3(조건&분기) S4(함수) (0) | 2020.07.31 |
[C] 인프런 나도코딩 1일차 S1(변수, 상수, 입출력) S2(반복문) (0) | 2020.07.31 |
비주얼 스튜디오 유용한 단축키 10가지 (0) | 2020.07.29 |
댓글