본문 바로가기
Basic C Language

#26. Pointer

by Srff5123 2023. 5. 3.
728x90

#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 = &num;
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;
}

728x90

'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