#include <stdio.h>
void Swap(int* const _pLhs, int* const _pRhs);
void MyScanf(char _format, void* _input); //받기는 받아야하는데 먼지 모를땐 void*
int main() {
// 포인터(Pointer)
// C,C++ 존재의의, 게임만들때 C를 쓰는 이유
// 개념보단 잘쓰는게 중요 , 많이해봐야함
// 변수의 주소를 저장하는 변수
int iVal = 10;
int* ipVal = &iVal; //주소를 저장하는 포인터를 만들때 쓰는 *
float fVal = 3.14f;
ipVal = &fVal; //& : 주소를 알려줌
printf("*ipVal: %f\n", *((float*)ipVal)); // *를 붙일 시 주소가 가르키는 실제값을 보여줌 현재 코드에선 fVal 값을 보여주는것
//포인터형변환가능//포인터의 자료형은 읽는 방법을 제공
printf("int* Size: %d Byte\n", sizeof(int*)); //4Byte 포인터는 자료형이 달라도 4Byte
printf("double* Size: %d Byte\n", sizeof(double*)); //4Byte
//void* vPtr = 10; // 주소인 10이 들어감 값이 아니라 이럴 경우 위험함
void* vPtr = NULL; // 허용 가능한 값 NULL(0) 초기화 할때 사용 값 넣을게 없을 경우 무조건 NULL로 초기화
// 읽는 방법을 보이드에서 사용할 자료형으로 형변경해서 주로 사용
//void voidValue = 0;
//printf("void Size : %d Byte\n", sizeof(void));
printf("void* Size: %d Byte\n", sizeof(void*)); // 4Byte
//////////////////////////////////
int lhs = 5, rhs = 3;
// temp
//int tmp = lhs; // 임시 함수
//lhs = rhs;
//rhs = tmp; // 알고리즘
// 답이 같으면 상관없음
Swap(&lhs, &rhs); //주소를 던져 줌
printf("lhs : %d / rhs : %d\n", lhs, rhs); // 한번이상 반복 시 함수 만드는게 유리함
int iInput = 0;
//scanf_s("%d", &iInput);
MyScanf('d', &iInput);
printf("iInput: %d\n", iInput);
float fInput = 0.0f;
MyScanf('f', &fInput);
printf("fInput: %f\n", fInput);
/////////////////////////
const int* const cpVal = NULL;
//값 주소 상수화 / 별표.코드에서 const를 자주 써야함
//포인터의 경우 두군데를 바꿀 수 있기 때문에 const(상수)화를 따로 따로 해야한다.
//cpVal = &iVal; 주소 변경
//*cpVal = 1000; 값 변경
//////////////////////////
int iArr[5] = { 1, 2, 3, 4, 5 };
int* iArrPtr = iArr;
printf("iArrPtr[2]: %d\n\n", iArrPtr[2]);
printf("iArr: %p\n", iArr);
printf("&iArr[3]: %p\n", &iArr[3]);
printf("iArr[3]: %d\n\n", iArr[3]);
printf("iArrPtr: %p\n", iArrPtr);
printf("iArrPtr + 3: %p\n", iArrPtr + 3);
printf("*(iArrPtr+3): %d\n\n", *(iArrPtr + 3));
//포인터 연산 or 주소 연산 / 주소는 더하면 자료형 크기만큼 더해짐 (한칸씩)
printf("*(iArr + 3): %d\n\n", *(iArr + 3));
////////////////////////////////////////
// 다중포인터(Multi-Demension Pointer)
// 더블포인터
int newVal = 10;
int* pNewVal = &newVal; // 주소를 저장
int** ppNewVal = &pNewVal; // 포인터에 저장된 포인터의 주소를 저장하는것
printf("**ppNewVal: %d\n", **ppNewVal);
printf("*pNewVal: %p\n", &*pNewVal);
printf("**ppNewVal: %p\n", &**ppNewVal);
int count = 0;
for (int i = 0; i < 5; i++) {
printf("*");
if (count == 5 && i == 4) {
printf("*");
}
else if (i == count && count == 1) {
++count;
}
else if (i == count) {
++count;
i = 0;
printf("\n");
}
retun 0;
}
//void Swap(int _lhs, int _rhs) {
// printf("Swap before: %d, %d\n", _lhs, _rhs);
// int tmp = _lhs;
// _lhs = _rhs;
// _rhs = tmp;
// printf("Swap after: %d, %d\n", _lhs, _rhs);
// }
// 위 함수는 지역변수로 인해 실제값은 바끼지 않음
void Swap(int* const _pLhs, int* const _pRhs) { //만들때 *
printf("Swap before: %d, %d\n",*_pLhs,*_pRhs);
int tmp = *_pLhs; //값을 찾을 때 *
*_pLhs = *_pRhs;
*_pRhs = tmp;
printf("Swap after: %d, %d\n", *_pLhs, *_pRhs);
}
// 지역 변수지만 포인터로 주소를 알 수 있으면 아무때나 찾아가서 바꿀 수 있다.
void MyScanf(char _format, void* _input) {
// 입력처리
switch (_format) {
case 'd':
*((int*)_input) = 1000;
break;
case 'f':
*((float*)_input) = 3.14f;
break;
}
}
tip.
디버깅 하는법 단축키
브레이크 포인트 전까지 계산
F5 - 디버깅
F9 - 브레이크 포인트 (빨간점)
F10 - 한 줄씩 실행
F11 - 한 개씩 코드 실행
'수업 일기장' 카테고리의 다른 글
수업 일기장 #스왑 (0) | 2021.01.18 |
---|---|
수업 일기장 #배열 덧셈 (0) | 2021.01.18 |
수업일기장 #자습 (0) | 2021.01.18 |
수업 일기장 #문자열 (0) | 2021.01.18 |
수업 일기장 #배열 , 다차원 배열 (0) | 2021.01.18 |