C/Fundamentals

C Basics 5/ (์—ดํ˜ˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

metamong 2023. 7. 26.

๐Ÿ˜™ ์ ์  C์–ธ์–ด ๊ธฐ์ดˆ๊ฐ€ ๋๋‚˜๊ฐ„๋‹ค. ๋‹ค์ฐจ์› ๋ฐฐ์—ด๋ถ€ํ„ฐ ํฌ์ธํ„ฐ์˜ ํฌ์ธํ„ฐ, void ํฌ์ธํ„ฐ๊นŒ์ง€ 16์žฅ๋ถ€ํ„ฐ 20์žฅ๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ๋‹ค๋ฃฌ๋‹ค.


16. ๋‹ค์ฐจ์› ๋ฐฐ์—ด

โ‘  2์ฐจ์› ๋ฐฐ์—ด / ์„ ์–ธ / ์ ‘๊ทผ / sizeof

ex) ์„ธ๋กœ๊ฐ€ 3, ๊ฐ€๋กœ๊ฐ€ 4์ธ intํ˜• 2์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ์€ int arr1[3][4]; (์„ธ๋กœ๊ฐ€ 3, ๊ฐ€๋กœ๊ฐ€ 4์ธ 2์ฐจ์› ๋ฐฐ์—ด)

ex) ์—ฌ๋Ÿฌ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ

→ sizeof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 2์ฐจ์› ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ธ๋กœ ๊ธธ์ด x ๊ฐ€๋กœ ๊ธธ์ด x ์ž๋ฃŒํ˜• ํฌ๊ธฐ๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.

#include <stdio.h>

int main(void) {
  int arr1[3][4];
  int arr2[7][9];
  printf("arr1 size: %d\n",sizeof(arr1)); //arr1 size: 48
  printf("arr2 size: %d\n",sizeof(arr2)); //arr2 size: 252
  return 0;
}

 

→ 2์ฐจ์› ๋ฐฐ์—ด์š”์†Œ์˜ ์ ‘๊ทผ์€ arr[x][y]๋กœ ์ง์ ‘ = ๋Œ€์ž…์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด ๋ฐฐ์—ด ์›์†Œ์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 

ex) ๋นŒ๋ผ์˜ ๊ฐ ๊ฑฐ์ฃผ์ธ์› ์ž…๋ ฅ๋ฐ›๊ณ  ์ธต๋ณ„ ์ธ์›์ˆ˜ ํ•ฉ ์ถœ๋ ฅํ•˜๊ธฐ

#include <stdio.h>

int main(void) {
  int villa [4][2];
  int popu, i, j;

  for(i=0;i<4;i++){
    for(j=0;j<2;j++){
      printf("floor %d ho %d population: ",i+1,j+1);
      scanf("%d",&villa[i][j]);
    }
  }

  for(int i = 0; i < 4; i++){
    popu = 0;
    popu += villa[i][0];
    popu += villa[i][1];
    printf("%d floor total population: %d\n",i+1,popu);
  }
  return 0;
}
/*
floor 1 ho 1 population: 2
floor 1 ho 2 population: 4
floor 2 ho 1 population: 3
floor 2 ho 2 population: 5
floor 3 ho 1 population: 2
floor 3 ho 2 population: 6
floor 4 ho 1 population: 4
floor 4 ho 2 population: 3
1 floor total population: 6
2 floor total population: 8
3 floor total population: 8
4 floor total population: 7
*/

 

โ‘ก 2์ฐจ์› ๋ฐฐ์—ด์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

→ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ ๊ฐ’์€ 1์ฐจ์›์  ๊ตฌ์กฐ. ๋”ฐ๋ผ์„œ 2์ฐจ์› ๋ฐฐ์—ด๋„ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—๋Š” 1์ฐจ์›์˜ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค.
→ Application - ์šด์˜์ฒด์ œ(OS) - ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ด๋ ‡๊ฒŒ 3๋‹จ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ, ์šด์˜์ฒด์ œ OS๊ฐ€ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐ ์—ญํ•  ์žˆ์Œ

 

ex) int arr[2][3]์˜ ๋ฉ”๋ชจ๋ฆฌ์ƒ ๊ตฌ์กฐ

 

: ์‹ค์ œ ์œ„ ๊ทธ๋ฆผ์˜ ํ˜•ํƒœ๋กœ ๋ฐฐ์—ด์ด ํ• ๋‹น๋˜๋Š” ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด 2์ฐจ์› ๋ฐฐ์—ด์š”์†Œ์˜ ์ฃผ์†Œ ๊ฐ’ ์ถœ๋ ฅ

#include <stdio.h>

int main(void) {
  int arr[2][3];
  int i, j;
  for(i=0;i<2;i++)
    for(j=0;j<3;j++)
      printf("%p\n",&arr[i][j]);
  return 0;
}
/*
0x7ffedddb8b10
0x7ffedddb8b14
0x7ffedddb8b18
0x7ffedddb8b1c
0x7ffedddb8b20
0x7ffedddb8b24
*/

 

โ‘ข 2์ฐจ์› ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

(1) ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”

→ 1์ฐจ์› ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 2์ฐจ์› ๋ฐฐ์—ด๋„ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ผ๋ถ€ ์š”์†Œ์— ๋Œ€ํ•ด์„œ๋Š” ์ดˆ๊ธฐํ™” ์ƒ๋žต ๊ฐ€๋Šฅ. ๋น„๊ฒŒ ๋˜๋Š” ๊ณต๊ฐ„์€ 1์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

ex) ํ•˜๋‹จ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

#include <stdio.h>

int main(void) {
  int i, j;
  int arr1[3][3]={
  {1,2,3},
  {4,5,6},
  {7,8,9}
  };

  int arr2[3][3]={
  {1},
  {4,5},
  {7,8,9}
  };

  int arr3[3][3] = {1, 2, 3, 4, 5, 6, 7};

  for(i=0;i<3;i++){
    for(j=0;j<3;j++)
      printf("%d ", arr1[i][j]);
    printf("\n");
  }
  printf("\n");

  for(i=0;i<3;i++){
    for(j=0;j<3;j++)
      printf("%d ", arr2[i][j]);
    printf("\n");
  }
  printf("\n");

  for(i=0;i<3;i++){
    for(j=0;j<3;j++)
      printf("%d ", arr3[i][j]);
    printf("\n");
  }
  printf("\n");
  
  
  return 0;
}

/*
1 2 3 
4 5 6 
7 8 9 

1 0 0 
4 5 0 
7 8 9 

1 2 3 
4 5 6 
7 0 0 
*/

 

(2) ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ณ  ์ดˆ๊ธฐํ™”

→ ๋ฐฐ์—ด์˜ ์„ธ๋กœ๊ธธ์ด๋งŒ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค ex) int arr1[][4] = {1, 2, 3, 4, 5, 6, 7, 8};
→ ๋ฐฐ์—ด์˜ ๊ฐ€๋กœ๊ธธ์ด๋Š” ์ƒ๋žต์ด ๋ถˆ๊ฐ€๋Šฅ. ๋ฐฐ์—ด ๋‚ด์˜ ์›์†Œ ๊ฐ€๋กœ๊ธธ์ด๊ฐ€ ํ™•์ •๋œ ์ƒํƒœ์—์„œ 1ํ–‰์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์›์†Œ๊ฐ€ ๋‚˜์—ด๋˜๊ธฐ์— ๊ฐ€๋กœ๊ธธ์ด๋Š” ํ•„์ˆ˜๋กœ ์•Œ์•„์•ผ ํ•œ๋‹ค.

ex1) ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ 9, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ 3์ธ intํ˜• 2์ฐจ์› ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜์—ฌ ๊ตฌ๊ตฌ๋‹จ ์ค‘ 2๋‹จ, 3๋‹จ, 4๋‹จ์„ ์ €์žฅํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  2์ฐจ์› ๋ฐฐ์—ด ์ถœ๋ ฅ

#include <stdio.h>

int main(void) {
  int gugu[3][9];

  for(int i = 0; i < 3; i++){
    printf("%d dan\n",i+2);
    for(int j = 0; j < 9; j++){
      printf("result of %d x %d? ",i+2,j+1);
      scanf("%d",&gugu[i][j]);
    }
  }

  for(int i = 0; i < 3; i++){
    for(int j = 0; j < 9; j++){
      printf("%d ",gugu[i][j]);
    }
    printf("\n");
  }
  
  return 0;
}
/*
2 dan
result of 2 x 1? 2
result of 2 x 2? 4
result of 2 x 3? 6
result of 2 x 4? 8
result of 2 x 5? 10
result of 2 x 6? 12
result of 2 x 7? 14
result of 2 x 8? 16
result of 2 x 9? 18
3 dan
result of 3 x 1? 3
result of 3 x 2? 6
result of 3 x 3? 9
result of 3 x 4? 12
result of 3 x 5? 15
result of 3 x 6? 18
result of 3 x 7? 21
result of 3 x 8? 24
result of 3 x 9? 27
4 dan
result of 4 x 1? 4
result of 4 x 2? 8
result of 4 x 3? 12
result of 4 x 4? 16
result of 4 x 5? 20
result of 4 x 6? 24
result of 4 x 7? 28
result of 4 x 8? 32
result of 4 x 9? 36
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
*/

 

ex2) ๋ฐฐ์—ด A = {1, 2, 3, 4, 5, 6, 7, 8}๊ณผ ๋ฐฐ์—ด B = {1, 5, 2, 6, 3, 7, 4, 8} ๊ฐ๊ฐ [2][4] ํ˜•ํƒœ, [4][2] ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์—์„œ ๋ฐฐ์—ด A๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ์ง„ํ–‰. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด B์—ญ์‹œ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜์ง€๋งŒ, ๋ฐ˜๋“œ์‹œ ๋ฐฐ์—ด A์— ์ €์žฅ๋œ ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์ดˆ๊ธฐํ™” ์ง„ํ–‰ํ•˜์ž

 

→ [a][b] index๊ฐ€ ๋ฐฐ์—ด B๋กœ ๋„˜์–ด๊ฐ€๋ฉด์„œ [b][a] index๋กœ ๋ฐ”๋€๋‹ค.

#include <stdio.h>

int main(void) {
  int A[2][4] = {1,2,3,4,5,6,7,8};
  int B[4][2];

  for(int i = 0; i < 4; i++)
    for(int j = 0; j < 2; j++){
      B[i][j] = A[j][i];
    }
  for(int i = 0; i< 4; i++){
    for(int j = 0; j < 2; j++){
      printf("%d ", B[i][j]);
    }
    printf("\n");
  }
  
  return 0;
}
/*
1 5 
2 6 
3 7 
4 8 
*/

 

ex3) ์„ฑ์ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ. ๊ตญ์–ด / ์˜์–ด / ์ˆ˜ํ•™ / ๊ตญ์‚ฌ ์ด๋ ‡๊ฒŒ ๋„ค ๊ณผ๋ชฉ์ด๊ณ  ํ•™์ƒ์€ ๋„ค ์‚ฌ๋žŒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋„ค ์‚ฌ๋žŒ์˜ ๋„ค ๊ณผ๋ชฉ ์ ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด ๋†“์€ ๋ฐฐ์—ด์— ์ด์ ๊นŒ์ง€ ์ด 5 x 5 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์ €์žฅ. ๋งˆ์ง€๋ง‰์— ๋ฐฐ์—ด ์ถœ๋ ฅ

#include <stdio.h>

int main(void) {
  int arr[5][5] ={0};
  int sum_of_student = 0;
  int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
  for(int i = 0; i < 4; i++){
    sum_of_student = 0;
    printf("student %d grade\n",i+1);
    for(int j = 0; j < 4; j++){
      printf("grades: ");
      scanf("%d",&arr[i][j]);
      sum_of_student += arr[i][j];
    }
    arr[4][0] += arr[i][0];
    arr[4][1] += arr[i][1];
    arr[4][2] += arr[i][2];
    arr[4][3] += arr[i][3];
    arr[i][4] = sum_of_student;
    arr[4][4] += sum_of_student;
  }
  
  //print array
  for(int i = 0; i < 5; i++){
    for(int j = 0; j < 5; j++){
      printf("%-3d", arr[i][j]);
    }
    printf("\n");
  }
  
  return 0;
}
/*
student 1 grade
grades: 5
grades: 4
grades: 6
grades: 5
student 2 grade
grades: 3
grades: 6
grades: 9
grades: 3
student 3 grade
grades: 4
grades: 8
grades: 2
grades: 7
student 4 grade
grades: 3
grades: 8
grades: 9
grades: 7
5  4  6  5  20 
3  6  9  3  21 
4  8  2  7  21 
3  8  9  7  27 
15 26 26 22 89
*/

 

โ‘ฃ 3์ฐจ์› ๋ฐฐ์—ด : ๊ฐ€๋กœ์™€ ์„ธ๋กœ 2์ฐจ์› ๋ฐฐ์—ด์— ๋†’์ด์˜ ๊ฐœ๋…์ด ์ถ”๊ฐ€๋˜์–ด 3์ฐจ์› ๋ฐฐ์—ด ํ˜•์„ฑ

ex1) int arr1[2][3][4]; (๋†’์ด๊ฐ€ 2, ์„ธ๋กœ๊ฐ€ 3, ๊ฐ€๋กœ๊ฐ€ 4์ธ intํ˜• 3์ฐจ์› ๋ฐฐ์—ด)
ex2) double arr2[5][5][5]; (๋†’์ด, ์„ธ๋กœ, ๊ฐ€๋กœ ๋ชจ๋‘ 5์ธ doubleํ˜• 3์ฐจ์› ๋ฐฐ์—ด)

→ 3์ฐจ์› ๋ฐฐ์—ด์˜ sizeof() ์—ฐ์‚ฐ ๊ฒฐ๊ณผ ๋†’์ด x ๊ฐ€๋กœ๊ธธ์ด x ์„ธ๋กœ๊ธธ์ด x sizeof(๋ฐ์ดํ„ฐ ํƒ€์ž…)์ด ๋‚˜์˜จ๋‹ค.

 

ex) ๊ฐ class๋ณ„ ํ•™์ƒ๋ณ„ ์„ฑ์  (ํ•œ class์˜ ํ•™์ƒ๋ณ„ ์„ฑ์ ์ด ์žˆ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ class๋กœ ๋ชจ์ธ 3์ฐจ์› ๋ฐฐ์—ด)

#include <stdio.h>

int main(void) {
  int mean = 0, i, j;
  int record[3][3][2] = {
  {
    {70,80}, //A class student 1 grades
    {94,90}, //A class student 2 grades
    {70,85} //A class student 3 grades
  },
  {
    {83,90}, //B class student 1 grades
    {95,60}, //B class student 2 grades
    {90,82} //B class student 3 grades
  },
  {
    {98,89}, //C class student 1 grades
    {99,94}, //C class student 2 grades
    {91,87} //C class student 3 grades
  }
};

  for(i=0;i<3;i++)
    for(j=0;j<2;j++)
      mean += record[0][i][j];
  printf("mean of A class grades: %g\n",(double)mean/6);

  mean = 0;
  for(i=0;i<3;i++)
    for(j=0;j<2;j++)
      mean += record[1][i][j];
  printf("mean of B class grades: %g\n",(double)mean/6);

  mean=0;
  for(i=0;i<3;i++)
    for(j=0;j<2;j++)
      mean += record[2][i][j];
  printf("mean of C class grades: %g\n",(double)mean/6);
  
  return 0;
}
/*
mean of A class grades: 81.5
mean of B class grades: 83.3333
mean of C class grades: 93
*/

 

→ ์ฆ‰ 3์ฐจ์› ๋ฐฐ์—ด์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ด ๋ชจ์—ฌ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 2์ฐจ์› ๋ฐฐ์—ด์€ 1์ฐจ์› ๋ฐฐ์—ด์ด ์—ฌ๋Ÿฟ ๋ชจ์—ฌ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

→ ์œ„ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์•ž๋ถ€๋ถ„์— ์œ„์น˜ํ•œ 2์ฐจ์› ๋ฐฐ์—ด์ด ์ฒซ๋ฒˆ์งธ ํ•™๊ธ‰์ด ๋˜๊ณ , ๊ทธ ๋‹ค์Œ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ด ๋‘๋ฒˆ์งธ ํ•™๊ธ‰ ์ˆœ์œผ๋กœ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

17. ํฌ์ธํ„ฐ์˜ ํฌ์ธํ„ฐ

โ‘ค '์ด์ค‘ ํฌ์ธํ„ฐ(๋”๋ธ” ํฌ์ธํ„ฐ)': ํฌ์ธํ„ฐ์˜ ํฌ์ธํ„ฐ๋กœ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋˜ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค. ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์„ ์–ธ์— ์‚ฌ์šฉ๋˜๋Š” * ์—ฐ์‚ฐ์ž๋ฅผ ๋‘ ๊ฐœ ์ด์–ด์„œ ์„ ์–ธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด intํ˜• ์ด์ค‘ ํฌ์ธํ„ฐ๋Š” int ** dptr๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

ex) double *ptr = &num; double **dptr = &ptr;

→ ์œ„ ์ฝ”๋“œ์—์„œ doubleํ˜• ์ด์ค‘ํฌ์ธํ„ฐ dptr์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์„ ๊ฐ€๋ฆฌํ‚ค๊ณ , ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์€ ๋ณ€์ˆ˜ num์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ *dptr์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์„ ์˜๋ฏธํ•˜๊ณ , *(*dptr)์€(**dptr๋กœ๋„ ํ‘œํ˜„ ๊ฐ€๋Šฅ) ๋ณ€์ˆ˜ num์„ ๋œปํ•œ๋‹ค.

ex) ์˜ˆ์ œ: ๋ณ€์ˆ˜ num์˜ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ ptr, ptr์˜ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ dptr / ๊ทธ๋ฆฌ๊ณ  ptr2 ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  dptr์„ ์‚ฌ์šฉํ•ด ptr2์— ptr์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ, ptr2๋„ num์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ๋” dptr์„ ์‚ฌ์šฉ

#include <stdio.h>

int main(void) {
  double num = 3.14;
  double *ptr = &num;
  double **dptr = &ptr;
  double *ptr2;

  printf("%9p %9p\n",ptr, *dptr);
  printf("%9g %9g\n", num, **dptr);
  ptr2 = *dptr;
  *ptr2 = 10.99;
  printf("%9g %9g\n", num, **dptr);

  return 0;
}
/*
0x7ffeb371de80 0x7ffeb371de80
     3.14      3.14
    10.99     10.99
*/

 

→ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•˜๋ฉด

: dptr์ด๋ผ๋Š” ๋”๋ธ” ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ptr2 ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ num์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ๋” ํ–ˆ๋‹ค. ์ฆ‰, ptr2 ๋ณ€์ˆ˜์— dptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š”, ์ฆ‰ num์˜ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ด์คŒ์œผ๋กœ์จ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ptr2๋ผ๋Š” ์ƒˆ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ num์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ–ˆ๋‹ค.

 

โ‘ฅ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ๋Œ€์ƒ์˜ call-by-reference

 

โ˜… ์ž˜๋ชป๋œ ์˜ˆ์‹œ - num1๊ณผ num2์˜ ๊ฐ’์ด ์„œ๋กœ ์•ˆ๋ฐ”๋€๋‹ค. โ˜…

#include <stdio.h>

void SwapIntPtr(int *p1, int *p2){
  int * temp = p1;
  p1 = p2;
  p2 = temp;
}

int main(void) {
  int num1 = 10, num2 = 20;
  int *ptr1 = &num1;
  int *ptr2 = &num2;
  printf("*ptr1, *ptr2: %d %d\n", *ptr1, *ptr2);

  SwapIntPtr(ptr1, ptr2);
  printf("*ptr1, *ptr2: %d %d\n", *ptr1, *ptr2);

  return 0;
}
/*
*ptr1, *ptr2: 10 20
*ptr1, *ptr2: 10 20
*/

 

: int *p1 = ptr1์ด๋ฏ€๋กœ ptr1์€ num1์˜ ์ฃผ์†Œ์ด๋ฏ€๋กœ, int *p1 = &num1, int *p2 = &num2๋กœ p1๊ณผ p2๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์ด๋ฉฐ ๊ฐ๊ฐ num1๊ณผ num2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.(์ฆ‰ ๊ฐ๊ฐ num1๊ณผ num2์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค). ์ด ๋•Œ, p1๊ณผ p2์˜ ๊ฐ’์„ swapํ–ˆ์œผ๋ฏ€๋กœ p1์—๋Š” num2์˜ ์ฃผ์†Œ, p2์—๋Š” num1์˜ ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€, ๊ฒฐ๊ตญ์€ p1์€ num2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ , p2๋Š” num1์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ptr1๊ณผ ptr2๋Š” ์—ฌ์ „ํžˆ ๊ฐ๊ฐ num1๊ณผ num2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ptr1์— ์ €์žฅ๋œ ์ฃผ์†Œ์ธ num1์˜ ์ฃผ์†Œ๋ฅผ p1 ๋ณ€์ˆ˜์— ๋Œ€์ž…, ptr2๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค(ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ) <์•„๋ž˜ ๊ทธ๋ฆผ ์ฐธ์กฐ>

→ ์ฒซ๋ฒˆ์งธ ๊ณผ์ •์—์„œ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ p1๊ณผ p2์— ๊ฐ๊ฐ ptr1๊ณผ ptr2์˜ ๋ณ€์ˆ˜ ๊ฐ’์ด ๋Œ€์ž…๋˜๊ณ , ๋‘๋ฒˆ์งธ ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๊ณผ์ •์—์„œ swap์ด ์ผ์–ด๋‚˜๋ฉด์„œ p1๊ฐ’๊ณผ p2๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€๋‹ค. ์ด๋Š” ๊ณง, ์„ธ๋ฒˆ์งธ ๊ณผ์ •์ธ ์ฐธ์กฐ ๋Œ€์ƒ์ด ์„œ๋กœ ๋ฐ”๋€๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

โ€ป ์ค‘์š”ํ•œ ๊ฑด, ์—ฌ์ „ํžˆ ptr1๊ณผ ptr2๋Š” num1๊ณผ num2๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ์ . ๋ณ€ํ™” ์—†๋‹ค. โ€ป

 

โ˜… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ - num1๊ณผ num2์˜ ๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€๋‹ค. โ˜…

: ์˜ฌ๋ฐ”๋ฅด๊ฒŒ num1๊ณผ num2 ๋ณ€์ˆ˜๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€Œ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ptr1๊ณผ ptr2์˜ ๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, p1๊ณผ p2๊ฐ€ num1๊ณผ num2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ๋˜๊ณ  p1๊ณผ p2๊ฐ€ ptr1๊ณผ ptr2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋”๋ธ”ํฌ์ธํ„ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

#include <stdio.h>

void SwapIntPtr(int **dp1, int **dp2){
  int * temp = *dp1;
  *dp1 = *dp2;
  *dp2 = temp;
}

int main(void) {
  int num1 = 10, num2 = 20;
  int *ptr1 = &num1;
  int *ptr2 = &num2;
  printf("*ptr1, *ptr2: %d %d\n", *ptr1, *ptr2);

  SwapIntPtr(&ptr1, &ptr2);
  printf("*ptr1, *ptr2: %d %d\n", *ptr1, *ptr2);

  return 0;
}
/*
*ptr1, *ptr2: 10 20
*ptr1, *ptr2: 20 10
*/

 

: ๋”๋ธ”ํฌ์ธํ„ฐ dp1๊ณผ dp2๊ฐ€ ๊ฐ๊ฐ ptr1๊ณผ ptr2๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. dp1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ptr1์— ์ €์žฅ๋œ ๊ฐ’๊ณผ dp2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ptr2์— ์ €์žฅ๋œ ๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€Œ๋Š” swap ๊ณผ์ •์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ptr1์—๋Š” num2์˜ ์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ , ptr2์—๋Š” num1์˜ ์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค. ๋”ฐ๋ผ์„œ *ptr1๊ณผ *ptr2์˜ ๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

18. ๋‹ค์ฐจ์› ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ์˜ ๊ด€๊ณ„

 

โ‘ฆโ‘งโ‘จโ‘ฉโ‘ชโ‘ซโ‘ฌโ‘ญโ‘ฎ
โ‘ฏโ‘ฐโ‘ฑโ‘ฒโ‘ณ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


* ์ถœ์ฒ˜ <์œค์„ฑ์šฐ ์—ดํ˜ˆ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ>

 

 

 

๋Œ“๊ธ€