#include <stdio.h>
#include <string.h>
//call by value 단순 값 저장
/*
call by value VS call by reference
//call by reference 주소값
*/
/*
void MaxAndMix(/* 매개변수 ) // 함수 사용
{
}
*/
void Swap_ptr2(int** dptr1, int** dptr2)
{
int* temp = NULL; // 포인터 temp에 null값을 주기
temp = *dptr1; 그것을 *dptr1에 값을 넣음
*dptr1 = *dptr2; *dptr1의 값을 *dptr2에 넣음
*dptr1 = temp; *dptr2의 값을 다시 temp에 넣는 방식으로 값을 바꿈
printf("함수 안 dptr1 : %d, dptr2 : %d\n", **dptr1, **dptr2); //함수 안에서는 20 20
return;
}
void Swap_ptr1(int* ptr1, int* ptr2)
{
int* temp = NULL;
temp = *ptr1;
*ptr1 = *ptr2;
*ptr1 = *temp;
printf("함수 안 ptr1 : %d, ptr2 : %d\n", *ptr1, *ptr2); //20 20
}
void Swap_ptr(int num1, int num2)
{
int temp = NULL;
temp = num1;
num1 = num2;
num2 = temp;
printf("함수 안 num1 : %d, num2 : %d\n", num1, num2); // 20 10
}
void double_pointer() // 이중 포인터
{
double num = 3.14; // &num = ptr
double* ptr = #
double** dptr = &ptr;
printf(" &dptr = 0x%p\n", &dptr);
printf(" &ptr = 0x%p\n", &ptr);
printf(" &num = 0x%p\n\n", &num);
printf(" &dptr = 0x%p\n", &ptr);
printf(" &dptr = 0x%p\n\n", dptr);
printf(" &dptr = 0x%p\n", &num);
printf(" &dptr = 0x%p\n", ptr);
printf(" &dptr = 0x%p\n\n", *dptr);
printf(" num : %g\n", num); //3.14
printf(" num : %g\n", *ptr); //3.14
printf(" num : %g\n", **dptr); //3.14
**dptr = 6.15;
printf(" num : %g\n", num);
}
int main()
{
#pragma region SWAP
{
int num1 = 10;
int num2 = 20;
int* ptr1 = &num1;
int* ptr2 = &num2;
int** dptr1 = &ptr1;
int** dptr2 = &ptr2;
Swap_ptr(num1, num2);
printf("함수 밖 num1 : %d, num2 : %d\n\n\n", num1, num2); // 위 함수를 호출했을 경우엔 10 20
Swap_ptr1(ptr1, ptr2);
printf("함수 밖 num1 : %d, num2 : %d\n", num1, num2); // 위 함수를 호출했을 경우엔 20 20
printf("함수 밖 ptr1 : %d, ptr2 : %d\n\n\n", *ptr1, *ptr2); // 20 20
Swap_ptr2(dptr1,dptr2);
printf("함수 밖 num1 : %d, num2 : %d\n", num1, num2); // 20 20
printf("함수 밖 ptr1 : %d, ptr2 : %d\n", *ptr1, *ptr2); // 20 20
}
#pragma endregion
double_pointer(); //더블 포인터 함수
#pragma region 이중 포인터 변수의 활용
{
int* maxPtr = 0;
int* minPtr = 0;
int arr[5]; // 1 2 3 4 5 최솟값은 : 1 , 최댓값은 : 5가 나오도록 출력
for (int i = 0; i < 5; i++)
{
printf("정수 입력 %d", i + 1);
scnaf_s("%d", &arr[i]);
}
MaxAndMix(/* 매개변수 호출 값*/); // int* arr. 매개변수
printf("최댓값 : &d, 최솟값 : %d", *maxPtr, *minPtr); // 5 / 1
}
#pragma endregion
#pragma region 배열 포인터 vs 포인터 배열
{
int a = 10, b = -20, c = 30;
int * pArr[3] = { &a, &b ,&c };
printf("%d\n", *pArr[0]); // 역참조로 값 찍기
printf("%d\n", *pArr[1]);
printf("%d\n", *pArr[2]);
int arr1[3] = { 0,1,2 };
int arr2[2][3] =
{
{0,1,2},
{3,4,5}
};
int arr3[3][3] =
{
{0,1,2},
{3,4,5},
{6,7,8}
};
int(*ptrArr)[3] = arr1;
for (int j = 0; j < 3; j++)
{
printf("%d", ptrArr[0][j]);
printf("\n\n");
}
ptrArr = arr2;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d", ptrArr[i][j]);
printf("\n");
}
printf("\n\n");
}
ptrArr = arr3;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d", ptrArr[i][j]);
printf("\n");
}
printf("\n\n");
}
}
#pragma endregion
#pragma region // 포인터 연습
{
int i = 0;
while (i != 4)
++i;
printf("%d", i);
}
{
int a = 50;
int* b;
b = &a;
*b += 20;
}
{
int a[5];
int* p;
for (int i = 0; i < 5; i++)
{
a[i] = i + 10;
}
p = a;
for (int i = 0; i < 5; i++)
{
printf("%d", *(p + i));
}
{
int arr[][3] = {1,2,3,4,5,6 };
//123
//456
int* p = arr[1]; // 행의 첫번째 자리
int x = *p; // 4
int y = *(p + 2); // 6
}
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int sum1 = *(*arr + 1) + *(*arr + 2); // 2 3 5
int sum2 = *arr[1] + *arr[2]; // 4 7 11
}
{
char str1[20] = "KOREA";
char str2[20] = "LOVE";
char* p1 = str1;
char* p2 = str2;
str1[1] = p2[2];
str2[3] = p1[5];
strcat(str1, str2); // 합치기
printf("%c\n", *(p1 + 2)); // R
}
{
int arr[2][3] = { 1,2,3,4,5,6 };
int(*p)[3] = NULL;
p = arr;
printf("%d\n", *(p[0] + 1) + *(p[1] + 2)); // 8
printf("%d\n", *(*(p+ 1)+ 0) + *(*(p + 1) + 1)); // 9
}
#pragma endregion
return 0;
}
'Basic C Language' 카테고리의 다른 글
#25 Pointer (0) | 2023.05.03 |
---|---|
#24 Pointer (0) | 2023.05.03 |
#23. 회문 구현 (1) | 2023.04.26 |
#22. String함수를 쓰지 않고 함수 구현하기 (0) | 2023.04.26 |
#21. Stream_and_Buffer (0) | 2023.04.26 |