C/Fundamentals

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

metamong 2023. 7. 5.

๐Ÿซก ๋„ค๋ฒˆ์งธ ํฌ์ŠคํŒ…๋ถ€ํ„ฐ๋Š” C์–ธ์–ด ์‹ฌํ™” ๊ฐœ๋…์„ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‚˜๊ฐ„๋‹ค! ์ ์  ํฅ๋ฏธ์žˆ์–ด์ง€๋Š” C์–ธ์–ด! ๋‘ ๋ฒˆ์งธ ํŒŒํŠธ 11์žฅ๋ถ€ํ„ฐ 15์žฅ๊นŒ์ง€ ์ •๋ฆฌํ–ˆ๋‹ค.


11. 1์ฐจ์› ๋ฐฐ์—ด

โ‘  ๋ฐฐ์—ด์ด๋ž€?

๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•  ํ•„์š” ์—†์ด, ํ•œ ๋ฒˆ์— ๋งŽ์€ ์ˆ˜์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ €์žฅ ๊ฐ€๋Šฅ!

 

โ‘ก 1์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ & ์ ‘๊ทผ

ํ•„์š”ํ•œ ๊ฒƒ: ๋ฐฐ์—ด์ด๋ฆ„, ์ž๋ฃŒํ˜•, ๊ธธ์ด์ •๋ณด

 

ex) int arr1[7];

: intํ˜• ๋ณ€์ˆ˜ 4๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ทธ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ arr1๋กœ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. intํ˜• ๋ณ€์ˆ˜ 4๊ฐœ๊ฐ€ ๋‚˜๋ž€ํžˆ ์„ ์–ธ๋˜์—ˆ๊ณ , ์‹ค์ œ๋กœ ๋ฐฐ์—ด์„ ์ด๋ฃจ๋Š” ์š”์†Œ๋“ค(๋ณ€์ˆ˜๋“ค)์˜ ์ฃผ์†Œ ๊ฐ’์„ ํ™•์ธ ํ•ด๋ณด๋ฉด ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋‹ค.

 

ex) float arr2[10]; double arr3[12];

 

์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” [] ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด arr[idx] = 20; ์ด๋ผ๋Š” ์ฝ”๋“œ๋Š” ๋ฐฐ์—ด arr์˜ idx+1 ๋ฒˆ์งธ ์š”์†Œ์— 20์„ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. []์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ์ˆซ์ž๋ฅผ index(์ธ๋ฑ์Šค ๊ฐ’)๋ผ ํ•˜๊ณ , ์ด ๋•Œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ง€์นญํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ˆซ์ž๊ฐ€ 1์ด ์•„๋‹ˆ๋ผ 0์ด๋‹ค.

 

ex)

#include <stdio.h>

int main(void) {
  int arr[5];
  int sum = 0, i;

  arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50;

  for(i=0;i<5;i++){
    sum += arr[i];
  }

  printf("total in arr is %d\n",sum);
  return 0;
}

 

→ ๋”ฐ๋ผ์„œ, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ์ด ์•„๋‹ˆ๋ผ, ๋ฐ˜๋ณต๋ฌธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆœ์ฐจ์  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

→ ๋งŒ์•ฝ, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 3์ธ ๋ฐฐ์—ด์ธ๋ฐ 4๋ฒˆ์งธ ์š”์†Œ์˜ ์ ‘๊ทผ์„ ์‹œ๋„ํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋” ์ฃผ์˜. ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์นจ๋ฒ”ํ•˜๋Š” ๋ฌธ์ œ์  ๋ฐœ์ƒ(์œ„ ์˜ˆ์ œ์—์„œ i๊ฐ€ 5๊นŒ์ง€ ์ง„ํ–‰๋˜๊ฒŒ ํ•˜๊ณ  ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•˜๋ฉด ๋งค์šฐ ํฐ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ด)

 

โ‘ข ๋ฐฐ์—ด์˜ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” / ๋ฐฐ์—ด์˜ ๊ธธ์ด, ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๋ฐฐ์—ด ํฌ๊ธฐ

(1) int arr1[5] = {1, 2, 3, 4, 5};

(2) int arr2[] = {1, 2, 3, 4, 5, 6, 7}; (์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ์˜ ์ˆ˜๋ฅผ ์ž๋™ ์ฐธ์กฐํ•˜์—ฌ ๊ธธ์ด์ •๋ณด๋ฅผ ์ฑ„์›Œ์ค€๋‹ค - ๋ฐฐ์—ด์˜ ๊ธธ์ด ์ •๋ณด ์ƒ๋žต ๊ฐ€๋Šฅ)

(3) int arr3[5] = {1, 2}; (์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ’์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋˜ ์ฑ„์šธ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋“ค์€ 0์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค)

 

ex)

#include <stdio.h>

int main(void) {
  int arr1[5] = {1, 2, 3, 4, 5};
  int arr2[] = {1, 2, 3, 4, 5, 6, 7};
  int arr3[5] = {1, 2};
  int ar1Len, ar2Len, ar3Len, i;

  printf("the size of arr1: %d\n",sizeof(arr1));
  printf("the size of arr2: %d\n",sizeof(arr2));
  printf("the size of arr3: %d\n",sizeof(arr3));

  ar1Len = sizeof(arr1)/sizeof(int); // length of arr1
  ar2Len = sizeof(arr2)/sizeof(int);
  ar3Len = sizeof(arr3)/sizeof(int);

  for(i=0;i<ar1Len;i++)
    printf("%d ",arr1[i]);
  printf("\n");
  
  for(i=0;i<ar2Len;i++)
    printf("%d ",arr2[i]);
  printf("\n");
  
  for(i=0;i<ar3Len;i++)
    printf("%d ",arr3[i]);
  printf("\n");
  
  return 0;
}

/*
the size of arr1: 20
the size of arr2: 28
the size of arr3: 20
1 2 3 4 5 
1 2 3 4 5 6 7 
1 2 0 0 0
*/

 

๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆˆ๋‹ค๋ฉด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ex) ๊ธธ์ด๊ฐ€ 5์ธ intํ˜• ๋ฐฐ์—ด ์„ ์–ธ - 5๊ฐœ์˜ ์ •์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ. ์ž…๋ ฅ์ด ๋๋‚˜๋ฉด, ์ž…๋ ฅ๋œ ์ •์ˆ˜ ์ค‘ ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’, ์ž…๋ ฅ๋œ ์ •์ˆ˜์˜ ์ด ํ•ฉ ์ถœ๋ ฅ

(์ด ๋•Œ, ๋ฐฐ์—ด ๋Œ€์ƒ์œผ๋กœ scanf ์ž…๋ ฅ๋ฐ›์„ ๋•Œ๋„ &arr[2]๋กœ ์•ž์— &ํ‘œ์‹œ๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค)

#include <stdio.h>

int main(void) {
  int arr[5];
  int sum = 0;
  int max, min;

  printf("enter 5 numbers in arr: ");
  for(int k = 0; k < 5; k++){
    scanf("%d",&arr[k]);
    sum += arr[k];
    if(k==0){
      max=arr[0];
      min=arr[0];
    }
    else{
      if(arr[k] > max){
      max = arr[k];
      }
    if(arr[k] < min){
      min = arr[k];
    }
    }
    
  }

  printf("sum: %d, max: %d, min: %d\n",sum,max,min);
  
  return 0;
}

 

ex) charํ˜• 1์ฐจ์› ๋ฐฐ์—ด์„ ์„ ์–ธ๊ณผ ๋™์‹œ์— "Good time" ๋ฌธ์žฅ์˜ ๋‚ด์šฉ์œผ๋กœ ์ดˆ๊ธฐํ™”, ์ดˆ๊ธฐํ™” ์ดํ›„์—๋Š” ์ €์žฅ๋œ ๋‚ด์šฉ์„ ์ถœ๋ ฅ

#include <stdio.h>

int main(void) {
  char sentence[] = "Good time";

  for(int i = 0; i < sizeof(sentence)/sizeof(char); i++){
    printf("%c",sentence[i]);
  }
  printf("\n");
  return 0;
}

 

โ‘ฃ charํ˜• ๋ฐฐ์—ด

→ ๋ณ€์ˆ˜ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด ๋ฐฐ์—ด ์„ ์–ธ์„ ๋งŒ๋“ค๋ฉด ๋ฌธ์ž์—ด์˜ ์ €์žฅ๊ณผ ๋ณ€๊ฒฝ๋„ ๊ฐ€๋Šฅ

ex) char str[] = "Good morning!";

 

→ ์œ„์™€ ๊ฐ™์ด ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋ฉด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 14๋กœ, ๋ฌธ์ž์—ด์˜ ๋์—๋Š” '\0'์ด๋ผ๋Š” ํŠน์ˆ˜๋ฌธ์ž(escape sequence)๊ฐ€ ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋œ๋‹ค. ๋ฌธ์ž์—ด์˜ ๋์— ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋˜๋Š” ๋ฌธ์ž '\0'์„ ๊ฐ€๋ฆฌ์ผœ null ๋ฌธ์ž๋ผ๊ณ  ํ•œ๋‹ค. 

 

ex) ์˜ˆ์‹œ

#include <stdio.h>

int main(void) {
  char str[] = "Good morning!";

  printf("size of an array: %d\n",sizeof(str));
  printf("null char: %c\n",str[13]);
  printf("null char: %d\n",str[13]);

  str[12] = '?';
  printf("after revision: %s\n",str);
  return 0;
}

 

→ ์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด null์€ ์ •์ˆ˜ํ˜•์œผ๋กœ ASCII code ๊ฐ’์ด 0์ด ๋œ๋‹ค. (๊ณต๋ฐฑ๋ฌธ์ž๋ผ๋ฉด ASCII code๊ฐ€ 32)

→ null๋„ ๊ณต๋ฐฑ๋ฌธ์ž๋„ %c๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋ชจ๋‘ ๋˜‘๊ฐ™์ด ํ‘œํ˜„๋˜๊ธฐ์— ์ฃผ์˜!

 

ex) ์˜ˆ์‹œ - null๋ฌธ์ž๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ฌธ์ž์—ด๊ณผ, null๋ฌธ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž ๋ฐฐ์—ด

#include <stdio.h>

int main(void) {
  char sentence1[] = "Good time";
  char sentence2[] = {'G','o','o','d',' ','t','i','m','e'};

  int sentence1Len, sentence2Len;
  
  sentence1Len = sizeof(sentence1) / sizeof(char);
  sentence2Len = sizeof(sentence2) / sizeof(char);
  
  printf("sentence 1's length is: %d, sentence2's length is %d\n",sentence1Len,sentence2Len);
  //sentence 1's length is: 10, sentence2's length is 9
  printf("\n");
  return 0;
}

 

โ‘ค scanf ํ•จ์ˆ˜์˜ ์ž…๋ ฅ: %s ์„œ์‹๋ฌธ์ž ์‚ฌ์šฉ

๋ฌธ์ž์—ด์„ ์ด์šฉํ•œ scanf๋Š” &ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ•œ ๋ฒˆ scanf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณต๋ฐฑ ๊ธฐ์ค€ ๋ฌธ์ž์—ด์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋‚˜๋ˆ„๋ฏ€๋กœ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž์—ด๋งŒ ์ถœ๋ ฅ๋œ๋‹ค. scanf๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„์ง“๋Š” ๊ธฐ์ค€์ด ๊ณต๋ฐฑ์ด๋ฏ€๋กœ, ๋ฌธ์žฅ ์ „์ฒด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ์—๋Š” ์ ์ ˆ์น˜ ์•Š๋‹ค. 

→ scanf ํ•จ์ˆ˜ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ์ž…๋ ฅ ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ ๋์—๋„ null ๋ฌธ์ž๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ๋‹ค. (C์–ธ์–ด์—์„œ ํ‘œํ˜„ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๋์—๋Š” null ๋ฌธ์ž ์ž๋™ ์‚ฝ์ž…)

→ ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰์— null ๋ฌธ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ž๋ฐฐ์—ด์ด๊ณ , null ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌธ์ž์—ด์ด๋‹ค. 

 

ex)

#include <stdio.h>

int main(void) {
  char str[50];
  int idx = 0;

  printf("enter the string: ");
  scanf("%s", str);
  printf("what you entered: %s\n",str);

  while(str[idx]!=0){
    printf("%c", str[idx]);
    idx++;
  }
  print("\n");
  return 0;
}

 

โ‘ฅ null๋ฌธ์ž

→ ๋ฌธ์ž์—ด ๊ตฌ๋ถ„ ์šฉ๋„

→ char str[100] = " . . . "; ์ฝ”๋“œ์—์„œ str[0]์ด ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘์œ„์น˜์ด๋ฉฐ, ๋ฌธ์ž์—ด์˜ ๋์—๋Š” null ๋ฌธ์ž ์‚ฝ์ž…

๋ฌธ์ž์—ด ๋„์ค‘์— null์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด %s ํ˜•ํƒœ๋กœ printf() ์ง„ํ–‰ํ•  ๊ฒฝ์šฐ null๊นŒ์ง€์˜ ํ•œ ๊ฐœ์˜ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•˜๊ณ , ์ธ์‹ํ•œ ๋ฌธ์ž์—ด๋งŒ ์ถœ๋ ฅ

 

ex) ํ•˜๋‚˜์˜ ์˜๋‹จ์–ด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์ž…๋ ฅ๋ฐ›์€ ์˜๋‹จ์–ด์˜ ๊ธธ์ด ๊ณ„์‚ฐ

#include <stdio.h>

int main(void) {
  char str[100];
  int idx = 0, cnt = 0;

  printf("enter your word: ");
  scanf("%s", str);

  while(str[idx]!=0){
    cnt++;
    idx++;
  }
  printf("%d\n",cnt);
  return 0;
}

 

ex) ์˜๋‹จ์–ด ์ž…๋ ฅ๋ฐ›๊ณ  charํ˜• ๋ฐฐ์—ด์— ์ €์žฅ, ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์˜๋‹จ์–ด๋ฅผ ์—ญ์ˆœ์œผ๋กœ ๋’ค์ง‘์Œ. null๋ฌธ์ž์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋’ค์ง‘์€ ์˜๋‹จ์–ด ์ถœ๋ ฅํ•˜๊ธฐ

 

- ํ’€์ด (1) ๋จผ์ € ์ž…๋ ฅํ•œ ๋‹จ์–ด์˜ ๊ธธ์ด๋ฅผ while๋ฌธ์œผ๋กœ ์•Œ์•„๋‚ธ ๋’ค, ์ฒซ for๋ฌธ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๊ฑฐ๊พธ๋กœ ์ €์žฅ, ๋‘ ๋ฒˆ์งธ for๋ฌธ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ์ถœ๋ ฅ

#include <stdio.h>

int main(void) {
  char str[100];
  char str2[100];
  int length=0, idx;

  printf("enter your word: ");
  scanf("%s", str);

  while(str[length] != 0){
    length++;
  }
  idx = length-1;
  for(int j = 0; j < length; j++){
    str2[j] = str[idx];
    idx--;
  }

  for(int k = 0; k < length; k++){
    printf("%c",str2[k]);
  }
  
  printf("\n");
  return 0;
}

 

- ํ’€์ด (2) while๋ฌธ์œผ๋กœ ์˜๋‹จ์–ด์˜ ๊ธธ์ด๋ฅผ ํŒŒ์•…ํ•œ ๋’ค, for๋ฌธ์œผ๋กœ ์˜๋‹จ์–ด ๊ธธ์ด์˜ ์ ˆ๋ฐ˜๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ฉฐ ์•ž๊ณผ ๋’ค๋ฅผ ์„œ๋กœ ๋ฐ”๊ฟˆ (temp ๋ณ€์ˆ˜ ์‚ฌ์šฉ)

#include <stdio.h>

int main(void) {
  char voca[100];
  int len = 0, i;
  char temp;

  printf("enter your word: ");
  scanf("%s",voca);

  while(voca[len] != '\0')
    len++;

  for(int i = 0; i < len/2; i++){
    temp = voca[i];
    voca[i] = voca[(len-i)-1];
    voca[(len-i)-1] = temp;
  }

  printf("after reversing... %s\n",voca);
  return 0;
}

 

ex) ์˜๋‹จ์–ด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์ž…๋ ฅ๋ฐ›์€ ์˜๋‹จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฌธ์ž ์ค‘์—์„œ ์•„์Šคํ‚ค ์ฝ”๋“œ์˜ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ž๋ฅผ ์ฐพ์•„์„œ ์ถœ๋ ฅ(์˜ˆ๋ฅผ ๋“ค์–ด LOVE๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด V ์ถœ๋ ฅ)

#include <stdio.h>

int main(void) {
  char word[100];
  printf("your word: ");
  scanf("%s",word);

  char max = 0;
  int idx = 0;
  while(word[idx] != 0){
    if(word[idx] > max){
      max = word[idx];
    }
    
    idx++;
  }

  printf("%c\n",max);
  
  return 0;
}

12. ํฌ์ธํ„ฐ์˜ ์ดํ•ด

โ‘ฆ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ - ์ฃผ์†Œ ๊ฐ’์˜ ์ €์žฅ

→ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

 

ex) ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด,

#include <stdio.h>

int main(void) {
  char ch1 = 'A', ch2 = 'Q';
  int num = 7;
  return 0;
}

 

→ char ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ 1๋ฐ”์ดํŠธ, int ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ 4๋ฐ”์ดํŠธ๋กœ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์™€ ๊ฐ™์ด ๋ฐฐ์น˜๋˜์–ด ์žˆ๋‹ค. (๊ผญ ์—ฐ์†์ ์œผ๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š” ๊ฑด x)

→ ์ด ๋•Œ, 1 byte ๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น์ด ๋˜๋Š”๋ฐ, ๊ฐ byte ๋ณ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’ ์ž์ฒด๋Š” ์ •์ˆ˜์ด๋ฉฐ ํ•ด๋‹น ์ •์ˆ˜๋ฅผ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ๋ จ๋œ ๊ฐœ๋…์ด 'ํฌ์ธํ„ฐ ๋ณ€์ˆ˜'

→ ์ด ๋•Œ, 1๋ฐ”์ดํŠธ๋ฅผ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋””์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ์ง€ ์•Œ๋ ค๋ฉด ์‹œ์ž‘๋ฒˆ์ง€๋งŒ์„ ๊ฐ€์ง€๊ณ  ์œ„์น˜๋ฅผ ํ‘œํ˜„

ex) ์œ„ intํ˜• ๋ณ€์ˆ˜ num์€ 0x12ff75๋ฒˆ์ง€์— ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.

 

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” * ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉ

ex) int * pnum;

โ‰ซ pnum์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„

โ‰ซ int *์€ intํ˜• ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

 

ex) pnum = &num;

โ‰ซ ์œ„ ์˜ˆ์‹œ์—์„œ &์—ฐ์‚ฐ์ž๋Š” & ์˜ค๋ฅธ์ชฝ์— ๋“ฑ์žฅํ•˜๋Š” ํ”ผ์—ฐ์‚ฐ์ž์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค. & ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” num์˜ ์ฃผ์†Œ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์ด๋ฅผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ pnum์— ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

โ‰ซ ๋”ฐ๋ผ์„œ, ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ pnum์— num์˜ ์ฃผ์†Œ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ์ด๋ฅผ "ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ pnum์ด intํ˜• ๋ณ€์ˆ˜ num์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค"๋ผ๊ณ  ํ‘œํ˜„

โ‰ซ ์—ฌ๊ธฐ์„œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋Š” 4byte ๋˜๋Š” 8byte ๊ฐ€๋Šฅํ•˜๋‹ค. 32bit system์—์„œ๋Š” 4byte, 64bit system์—์„œ๋Š” 8byte๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๊ฐ bit system์—์„œ ํ‘œํ˜„ํ•˜๋Š” ์ฃผ์†Œ ๊ฐ’์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. (๋‹น์—ฐํžˆ ์ฃผ์†Œ ๊ฐ’์˜ ํฌ๊ธฐ = ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ)

 

โ‘ง ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์„ ์–ธ / ํฌ์ธํ„ฐ ํ˜•(Type)

→ type * ptr; ์ฆ‰, typeํ˜• ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์˜ ์„ ์–ธ

ex) int num = 7; int * pnum = &num;์—์„œ int * pnum์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” pnum์ด ๊ฐ€๋ฆฌํ‚ค๋Š”(์ฆ‰, pnum์ด๋ผ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๋Š”) ๋ณ€์ˆ˜ num์˜ ์ž๋ฃŒํ˜•์ด int์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

→ ๋”ฐ๋ผ์„œ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์„ ์–ธ ํ˜•ํƒœ๋งŒ ๋ณด๊ณ ๋„, ํฌ์ธํ„ฐ๊ฐ€ ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜• ์ง์ž‘ ๊ฐ€๋Šฅ

 

→ int *, char *, double * ๋“ฑ์„ ๊ฐ€๋ฆฌ์ผœ ํฌ์ธํ„ฐ ํ˜•(type)์ด๋ผ ํ•œ๋‹ค. 

 

โ‘จ & ์—ฐ์‚ฐ์ž  / * ์—ฐ์‚ฐ์ž

& ์—ฐ์‚ฐ์ž๋Š” ํ”ผ์—ฐ์‚ฐ์ž์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ž. &์—ฐ์‚ฐ์ž์˜ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ณ€์ˆ˜์—ฌ์•ผ ํ•˜๋ฉฐ, ์ƒ์ˆ˜๋Š” ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค. 

* ์—ฐ์‚ฐ์ž๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž. ์ฆ‰ ์˜ˆ๋ฅผ ๋“ค์–ด *pnum์ด๋ผ๋ฉด pnum์ด๋ผ๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.

 

ex) *์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ num ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ๊ฐ’์„ 10์—์„œ 20์œผ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค.

#include <stdio.h>

int main(void) {
  int num = 10;
  int *pnum = &num;
  *pnum = 20;
  printf("%d\n",num); //20
  return 0;
}

 

ex) pnum intํ˜• ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋‘ ๋ณ€์ˆ˜ ๊ฐ๊ฐ์˜ ์ฃผ์†Œ๊ฐ€ ๋˜์–ด ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ์—ˆ๋‹ค.

#include <stdio.h>

int main(void) {
  int num1 = 100, num2 = 100;
  int *pnum;

  pnum = &num1;
  (*pnum)+=30;

  pnum = &num2;
  (*pnum)-=30;

  printf("num1: %d, num2: %d\n",num1, num2); //num1: 130, num2: 70
  return 0;
}

 

โ‘ฉ ๋‹ค์–‘ํ•œ ํฌ์ธํ„ฐ ํ˜•

→ pnum์ด intํ˜• ๋ณ€์ˆ˜๋ผ๋ฉด "pnum์— ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ์‹œ์ž‘์œผ๋กœ 4byte๋ฅผ ์ฝ์–ด ๋“ค์—ฌ์„œ ์ด๋ฅผ ์ •์ˆ˜๋กœ ํ•ด์„"

→ pnum์ด doubleํ˜• ๋ณ€์ˆ˜๋ผ๋ฉด "pnum์— ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ์‹œ์ž‘์œผ๋กœ 8byte๋ฅผ ์ฝ์–ด ๋“ค์—ฌ์„œ ์ด๋ฅผ ์‹ค์ˆ˜๋กœ ํ•ด์„"

 

→ ์ด๋ ‡๊ฒŒ ํฌ์ธํ„ฐ ํ˜•์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐธ์กฐํ•˜๋Š” ๊ธฐ์ค€์ด ๋œ๋‹ค. ํฌ์ธํ„ฐ ํ˜•์„ ์ •์˜ํ•œ ์ด์œ ๋Š” * ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ ‘๊ทผ ๊ธฐ์ค€ ๋งˆ๋ จ. 

→ ์ฆ‰ * ์—ฐ์‚ฐ์ž ์•ž์— ํฌ์ธํ„ฐ์˜ ํ˜•์„ ๋งŒ๋“ค์–ด์„œ, ํฌ์ธํ„ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ํ•  ๋•Œ, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ณต๊ฐ„์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ex) ํ•œ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ์˜ˆ์ œ

#include <stdio.h>

int main(void) {
  int num = 10;
  int * ptr1 = &num;
  int * ptr2 = ptr1;

  (*ptr1)++;
  (*ptr2)++;
  printf("%d\n",num); //12
  return 0;
}

 

ex) intํ˜• ๋ณ€์ˆ˜ num1๊ณผ num2๋ฅผ ์„ ์–ธ๊ณผ ๋™์‹œ์— ๊ฐ๊ฐ 10๊ณผ 20์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , intํ˜• ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr1๊ณผ ptr2๋ฅผ ์„ ์–ธํ•˜์—ฌ ๊ฐ๊ฐ num1๊ณผ num2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ์ด ์ƒํƒœ์—์„œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr1๊ณผ ptr2๋ฅผ ์ด์šฉํ•ด์„œ num1์˜ ๊ฐ’์„ 10 ์ฆ๊ฐ€์‹œํ‚ค๊ณ , num2์˜ ๊ฐ’์„ 10 ๊ฐ์†Œ์‹œํ‚ค์ž. ์ด์ œ ๋‘ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr1๊ณผ ptr2๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์„ ์„œ๋กœ ๋ฐ”๊พธ์ž. ์ฆ‰ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr1์ด num2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ณ , ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr2๊ฐ€ num1์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ptr1๊ณผ ptr2๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜์ž.

#include <stdio.h>

int main(void) {
  int num1 = 10, num2 = 20;
  
  int * ptr1 = &num1;
  int * ptr2 = &num2;
  
  (*ptr1)+=10; // num1 20
  (*ptr2)-=10; // num2 10

  int *temp;
  temp = ptr2;
  ptr2 = ptr1;
  ptr1 = temp;

  printf("ptr1 points to %d, ptr2 points to %d\n",*ptr1, *ptr2);
  printf("num1: %d, num2: %d\n",num1, num2);
  
  return 0;
}

/*
ptr1 points to 10, ptr2 points to 20
num1: 20, num2: 10
*/

 

โ‘ช ์ž˜๋ชป๋œ ํฌ์ธํ„ฐ์˜ ์‚ฌ์šฉ

#include <stdio.h>

int main(void) {
  //(1)
  int *ptr;
  *ptr = 200;

  //(2)
  int *ptr2 = 125;
  *ptr2 = 10;
  return 0;
}

 

(1) ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๋งŒ ํ–ˆ์ง€๋งŒ, ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์–ด๋”˜๊ฐ€์— 200์œผ๋กœ ๋ฐ”๊พธ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ปดํ“จํ„ฐ ์ž…์žฅ์—์„œ๋Š” ๋ชจ๋ฅธ๋‹ค.

(2) ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์—ญ์‹œ ์„ ์–ธ๋งŒ ํ–ˆ์ง€๋งŒ, 125๊ฐ€ ์–ด๋””์ธ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ์—ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ๋ชจ๋ฅธ๋‹ค.

 

→ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ๋งŒ ํ•ด๋†“๊ณ  ์ดํ›„์— ์œ ํšจํ•œ ์ฃผ์†Œ ๊ฐ’์„ ์ฑ„์›Œ ๋„ฃ๋Š” ๋‹ค๋ฉด ์ดˆ๊ธฐํ™”๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ๋‹ค. ์ด๋ฅผ null pointer๋ผ๊ณ  ํ•˜๋ฉฐ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํŠน์ • ๊ณต๊ฐ„ ์–ด๋””๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ์•„์ง ์•„๋ฌด๋ฐ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค.

#include <stdio.h>

int main(void) {
  int *ptr1 = 0;
  int *ptr2 = NULL;
  return 0;
}

13. ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด! ํ•จ๊ป˜ ์ดํ•ดํ•˜๊ธฐ

โ‘ซ ๋ฐฐ์—ด์˜ ์ด๋ฆ„ = ํฌ์ธํ„ฐ

→ ์•ž์„œ ๋ฐฐ์šด ํฌ์ธํ„ฐ๋Š” ๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ ์˜€๋‹ค๋ฉด, ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ ์ƒ์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ์ด๋‹ค. ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ํฌ์ธํ„ฐ

→ %p conversion specifier๋กœ ๋ณ€์ˆ˜์˜ ์—ฌ๋Ÿฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด,

#include <stdio.h>

int main(void) {
  int arr[3] = {0, 1, 2};
  printf("name of the array: %p\n",arr);
  printf("first element: %p\n", &arr[0]);
  printf("second element: %p\n", &arr[1]);
  printf("third element: %p\n",&arr[2]);
  return 0;
}
/*
name of the array: 0x7ffe7b9854a0
first element: 0x7ffe7b9854a0
second element: 0x7ffe7b9854a4
third element: 0x7ffe7b9854a8
*/

 

๋ฐฐ์—ด์˜ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋˜๊ณ , ์ฆ‰ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ์˜ ์ฃผ์†Œ์ด๋ฉฐ, '๊ฐ’์˜ ์ €์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒ์ˆ˜'๋ผ๋Š”๊ฑธ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  ๋˜ํ•œ, intํ˜• ๋ฐฐ์—ด์š”์†Œ๊ฐ„ ์ฃผ์†Œ ๊ฐ’์˜ ์ฐจ๋Š” 4๋ฐ”์ดํŠธ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” ๊ณง '๋ชจ๋“  ๋ฐฐ์—ด ์š”์†Œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋‚˜๋ž€ํžˆ ํ• ๋‹น๋œ๋‹ค' ์ฆ๋ช… ๊ฐ€๋Šฅ

 

* ์•ž์„œ ๋ฐฐ์šด ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋Š” '๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ'๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋Š” '์ƒ์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ'๋กœ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋‹ค. (์ƒ์ˆ˜์ด๋ฏ€๋กœ ๋ฐ”๊พธ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ!)

 

ex) int arr1[5]; ๋ผ๋ฉด, ๋ฐฐ์—ด์˜ ์ด๋ฆ„ arr1์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์€ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ์ด๋ฉฐ, ์ด๋Š” intํ˜• ๋ณ€์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ arr1์€ intํ˜• ํฌ์ธํ„ฐ(int *)๋ผ๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜จ๋‹ค.

 

→ ์ฆ‰ 1์ฐจ์› ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ ํ˜•์€ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •ํ•œ๋‹ค (๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ์™€ ๋™์ผ!)

 

ex) ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ → * ์—ฐ์‚ฐ

→ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ์ด๋ฏ€๋กœ ๋ฐฐ์—ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด ๊ฐ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋ฐ”๊พธ์—ˆ๋‹ค.

#include <stdio.h>

int main(void) {
  int arr1[3] = {1,2,3};
  double arr2[3] = {1.1, 2.2, 3.3};

  printf("%d %g\n",*arr1, *arr2); // 1 1.1
  *arr1 += 100;
  *arr2 += 120.5;
  printf("%d %g\n",arr1[0], arr2[0]); // 101 121.6
  return 0;
}

 

→ ์ฆ‰, ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐฐ์—ด ์ด๋ฆ„ arr์„ ์‚ฌ์šฉํ•ด arr[0], arr[1], arr[2] arr[2] ๋ชจ๋‘ arr์ด๋ผ๋Š” ๋ฐฐ์—ด ์ด๋ฆ„์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด ๋‚ด์˜ ์›์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ํ•œ ๋ฒˆ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ ์ฃผ์†Œ๋ฅผ ptr ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ๋”ฐ๋กœ ์ €์žฅํ•ด ptr ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋กœ๋„ arr์ฒ˜๋Ÿผ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค! ์•„๋ž˜ ์˜ˆ์ œ ํ™•์ธํ•ด๋ณด์ž

 

ex) ๋ฐฐ์—ด ์ด๋ฆ„ arr์ฒ˜๋Ÿผ ptr ๋ณ€์ˆ˜๋กœ ๋ฐฐ์—ด ์›์†Œ๋“ค ์ ‘๊ทผํ•ด๋ณด๊ธฐ

#include <stdio.h>

int main(void) {
  int arr[3] = {15, 25, 35};
  int *ptr = &arr[0];

  printf("%d %d\n", ptr[0], arr[0]); // 15 15
  printf("%d %d\n", ptr[1], arr[1]); // 25 25
  printf("%d %d\n", ptr[2], arr[2]); // 35 35
  printf("%d %d\n", *ptr, *arr); // 15 15

  return 0;
}

 

โ‘ฌ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ

→ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์ฆ๊ฐ€ ๋ฐ ๊ฐ์†Œ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ex) int* ํ˜•๊ณผ double* ํ˜• ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์‚ฐ์ˆ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ ์˜ˆ์ œ๋ฅผ ์•„๋ž˜ ์‚ดํŽด๋ณด๋ฉด

#include <stdio.h>

int main(void) {
  int *ptr1 = 0x0010;
  double *ptr2 = 0x0010;

  printf("%p %p\n",ptr1+1, ptr1+2);
  printf("%p %p\n",ptr2+1, ptr2+2);

  printf("%p %p\n",ptr1,ptr2);
  ptr1++;
  ptr2++;
  printf("%p %p\n",ptr1,ptr2);
  return 0;
}

: ++๊ฐ€ ์ง„ํ–‰๋ ๋•Œ๋งˆ๋‹ค intํ˜• ํฌ์ธํ„ฐ์— ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’์€ 4์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ , doubleํ˜• ํฌ์ธํ„ฐ์— ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’์€ 8์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

 

→ ๋”ฐ๋ผ์„œ intํ˜• ํฌ์ธํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ n ์ฆ๊ฐ€ํ•˜๋ฉด nxsizeof(int)์˜ ํฌ๊ธฐ๋งŒํผ ์ฆ๊ฐ€ํ•˜๊ณ , doubleํ˜• ํฌ์ธํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ n ์ฆ๊ฐ€ํ•˜๋ฉด nxsizeof(double)์˜ ํฌ๊ธฐ๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค. (๊ฐ์†Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)

 

ex) ptr ํฌ์ธํ„ฐ์˜ ์ฆ๊ฐ€์—ฐ์‚ฐ์ž / ๊ฐ์†Œ์—ฐ์‚ฐ์ž์— ๋”ฐ๋ผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ๊ณ„์† ๋ฐ”๋€œ์„ ์•„๋ž˜๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

#include <stdio.h>

int main(void) {
  int arr[3] = {11, 22, 33};
  int *ptr = arr;
  printf("%d, %d, %d\n",*ptr, *(ptr+1), *(ptr+2)); // 11, 22, 33

  printf("%d ",*ptr); ptr++;
  printf("%d ",*ptr); ptr++;
  printf("%d ",*ptr); ptr--;
  printf("%d ",*ptr); ptr--;
  printf("%d ",*ptr); printf("\n"); // 11 22 33 22 11
  return 0;
}

 

→ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด int * ํ˜• ํฌ์ธํ„ฐ๋ผ๋ฉด + 1 ์”ฉ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์‹ค์ œ๋กœ๋Š” int๊ฐ€ 4byte์ด๋ฏ€๋กœ ์ฃผ์†Œ๊ฐ’์ด 4(10์ง„๋ฒ•)์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค. (๊ทธ ๋‹ค์Œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ์œ„ํ•ด์„œ) / ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ double *ํ˜• ํฌ์ธํ„ฐ๋ผ๋ฉด ์ฃผ์†Œ๊ฐ’์ด 8(10์ง„๋ฒ•)์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค

 

(+) *(++ptr) = 20;์ด๋‚˜ *(ptr+1) = 20; ๋ชจ๋‘ ํ˜„์žฌ ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜์—์„œ 4๋ฐ”์ดํŠธ ๋–จ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— 20์„ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ(int * ํ˜• ํฌ์ธํ„ฐ) ํ•˜์ง€๋งŒ ptr+1์˜ ๊ฒฝ์šฐ ptr ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์ฐจ์ด๋งŒ ์žˆ๋‹ค.

 

→ ๋”ฐ๋ผ์„œ arr[i]์€ *(arr+i)์™€ ๊ฐ™๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

ex) ๊ธธ์ด๊ฐ€ 5์ธ intํ˜• ๋ฐฐ์—ด์„ 1, 2, 3, 4, 5๋กœ ์ดˆ๊ธฐํ™”. ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr ์„ ์–ธ. ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํ˜•ํƒœ์˜ ์—ฐ์‚ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐ์—ด์š”์†Œ์— ์ ‘๊ทผํ•˜๋ฉด์„œ ๋ชจ๋“  ๋ฐฐ์—ด์š”์†Œ์˜ ๊ฐ’์„ 2์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ํ™•์ธ

#include <stdio.h>

int main(void) {
  int arr[5] = {1,2,3,4,5};
  int * ptr = arr;

  for(int i = 0; i < 5; i++){
    (*ptr) += 2;
    ptr++;
  }

  for(int j = 0; j < 5; j++){
    printf("%d ", arr[j]);
  }

  printf("\n");
  return 0;
}

 

ex) ์œ„ ์˜ˆ์ œ์—์„œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š๊ณ , ptr์„ ๋Œ€์ƒ์œผ๋กœ ๋ง์…ˆ์—ฐ์‚ฐ์„ ํ•˜์—ฌ, ๊ทธ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ฃผ์†Œ ๊ฐ’์„ ํ†ตํ•ด์„œ ๋ชจ๋“  ๋ฐฐ์—ด์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ 2์”ฉ ์ฆ๊ฐ€

#include <stdio.h>

int main(void) {
  int arr[5] = {1,2,3,4,5};
  int * ptr = arr;

  for(int i = 0; i < 5; i++){
    *(ptr+i) += 2;
  }

  for(int j = 0; j < 5; j++){
    printf("%d ", arr[j]);
  }

  printf("\n");
  return 0;
}

 

ex) ์œ„ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr ์„ ์–ธ. ๊ทธ ๋‹ค์Œ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ํ˜•ํƒœ์˜ ์—ฐ์‚ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๋ฐฐ์—ด์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋ชจ๋“  ์ •์ˆ˜๋ฅผ ๋”ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ

#include <stdio.h>

int main(void) {
  int arr[5] = {1,2,3,4,5};
  int * ptr = &arr[4];
  int ans = 0;

  for(int i = 0; i < 5; i++){
    ans += *ptr;
    ptr--;
  }

  printf("%d", ans);

  printf("\n"); //15
  return 0;
}

 

ex) ๊ธธ์ด๊ฐ€ 6์ธ intํ˜• ๋ฐฐ์—ด arr ์„ ์–ธํ•˜๊ณ  1, 2, 3, 4, 5, 6์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ, ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ 6, 5, 4, 3, 2, 1์ด ๋˜๋„๋ก ๋ณ€๊ฒฝ. ๋‹จ, ๋ฐฐ์—ด์˜ ์•ž๊ณผ ๋’ค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ์„ ์–ธํ•ด์„œ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ €์žฅ๋œ ๊ฐ’์˜ ์ˆœ์„œ๋ฅผ ๋’ค๋ฐ”๊พธ๊ธฐ.

#include <stdio.h>

int main(void) {
  int arr[6] = {1,2,3,4,5,6};
  int *ptr1 = arr;
  int *ptr2 = &arr[5];
  int length = sizeof(arr)/sizeof(int);
  for(int i = 0; i < length/2 ; i++){
    int temp;
    temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;

    ptr1++;
    ptr2--;
  }

  for(int j = 0; j < length; j++){
    printf("%d ",arr[j]);
  }
    
  printf("\n");
  return 0;
}
// 6 5 4 3 2 1

 

โ‘ญ ์ƒ์ˆ˜ ํ˜•ํƒœ/ ๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ์ˆ˜ ํ˜•ํƒœ/ ๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ

(1) char str1[] = "My String";

(2) char *str2 = "My String";

 

→ (1)์€ ๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ์ˆ˜ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ์ด๋‹ค. ์ƒ์ˆ˜ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ๋Š” ์œ„ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์œผ๋กœ str1์„ ๋œปํ•˜๋ฏ€๋กœ, str1 ์ž์ฒด๋Š” ๊ณ„์† ๋ฌธ์ž M์„ ๊ฐ€๋ฆฌํ‚ค๊ณ ๋งŒ ์žˆ๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์ด๋‹ค. ํ•˜์ง€๋งŒ str1์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด์šฉ์€ str1[0] = 'K' ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์–ผ๋งˆ๋“ ์ง€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

→ (2) ์ƒ์ˆ˜ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ์ด๋‹ค. ๋ณ€์ˆ˜ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ์ด๋ฏ€๋กœ ์œ„ str2๋Š” ๋ฌธ์ž M๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฌธ์ž๋„ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 

→ (1)(2) ๋ชจ๋‘ ๋ฌธ์ž์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž M์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ๋‹ค.

 

ex) str2๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ  / str1๋งŒ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž์—ด์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

#include <stdio.h>

int main(void) {
  char str1[] = "My String";
  char *str2 = "My String";

  printf("%s, %s\n",str1, str2);

  str2 = "Your String";
  printf("%s, %s\n",str1, str2);

  str1[0] = 'W';
  str2[0] = 'W';
  printf("%s, %s\n",str1, str2);
  return 0;
}

 

→ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์—ฌ์„œ ํ‘œํ˜„๋˜๋Š” ๋ฌธ์ž์—ด(์ƒ์ˆ˜ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด)์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅ๋œ ํ›„ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด printf()์•ˆ์— ์ƒ์ˆ˜ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์„ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ printf() ํ•จ์ˆ˜๋Š” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ๋ฌธ์ž์—ด์„ ํ†ต์งธ๋กœ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š๊ณ , ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ printf()์— ์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์€ ๋ฌธ์ž์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž ์ฃผ์†Œ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. 

 

โ‘ฎ ํฌ์ธํ„ฐ ๋ฐฐ์—ด

→ ํฌ์ธํ„ฐ ๋ฐฐ์—ด์€ ๋ง ๊ทธ๋Œ€๋กœ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„, ์ฃผ์†Œ ๊ฐ’์˜ ์ €์žฅ์„ ํ•œ ๋ฒˆ์— ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋œปํ•œ๋‹ค.

 

ex) int ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•œ ํฌ์ธํ„ฐ ๋ฐฐ์—ด

#include <stdio.h>

int main(void) {
  int num1 = 10, num2 = 20, num3 = 30;
  int *arr[3] = {&num1, &num2, &num3};

  printf("%d\n",*arr[0]);
  printf("%d\n",*arr[1]);
  printf("%d\n",*arr[2]);
  return 0;
}

 

ex) ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด

: ๋ฌธ์ž์—ด ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” strArr ํฌ์ธํ„ฐ ๋ฐฐ์—ด์—๋Š” ๊ฐ๊ฐ์˜ ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐ€๋ฉด ์ž๋™์œผ๋กœ ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๊ฐ€ ๊ฐ๊ฐ ์›์†Œ๋กœ์จ ์ €์žฅ์ด ๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <stdio.h>

int main(void) {
  char *strArr[3] = {"Simple", "String", "Array"};
  printf("%s\n",strArr[0]);
  printf("%s\n",strArr[1]);
  printf("%s\n",strArr[2]);
  return 0;
}
/*
Simple
String
Array
*/

14. ํฌ์ธํ„ฐ์™€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ดํ•ด

โ‘ฏ ์ธ์ž์ „๋‹ฌ์˜ ๊ธฐ๋ณธ๋ฐฉ์‹์€ ๊ฐ’์˜ ๋ณต์‚ฌ

→ ํ•จ์ˆ˜ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž์˜ ๊ฐ’์€ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ณต์‚ฌ๊ฐ€ ๋œ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์ด๋‹ค.

 

ex) int SimpleFunc(int num) { } / SimpleFunc(age)

→ ์œ„ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด age์ž์ฒด๊ฐ€ SimpleFunc()์— ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, age์— ์ €์žฅ๋œ ๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ๋งค๊ฐœ๋ณ€์ˆ˜ num์— ๋ณต์‚ฌ๋œ๋‹ค.

 

โ‘ฐ ๋ฐฐ์—ด์„ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ

→ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ํ•จ์ˆ˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๊ณ , ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐฐ์—ด์˜ ์œ„์น˜์ธ ์ฃผ์†Œ๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์„œ ์ด๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

ex) ShowArayElem()์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ธ์ž๋กœ param ๋ฐฐ์—ด ๋ณ€์ˆ˜ ํ˜•ํƒœ์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ถœ๋ ฅ

#include <stdio.h>

void ShowArayElem(int *param, int len){
  int i;
  for(i=0;i<len;i++)
    printf("%d ",param[i]);
  printf("\n");
}

int main(void) {
  int arr1[3] = {1,2,3};
  int arr2[5] = {4, 5, 6, 7, 8};
  ShowArayElem(arr1, sizeof(arr1)/sizeof(int));
  ShowArayElem(arr2, sizeof(arr2)/sizeof(int));
  
  return 0;
}

 

ex) ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์›์†Œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค.

#include <stdio.h>

void ShowArayElem(int *param, int len){
  int i;
  for(i=0;i<len;i++)
    printf("%d ",param[i]);
  printf("\n");
}

void AddArayElem(int *param, int len, int add){
  int i;
  for(i=0;i<len;i++)
    param[i] += add;
}

int main(void) {
  int arr[3] = {1,2,3};
  AddArayElem(arr, sizeof(arr)/sizeof(int), 1);
  ShowArayElem(arr, sizeof(arr)/sizeof(int));

  AddArayElem(arr, sizeof(arr)/sizeof(int), 2);
  ShowArayElem(arr, sizeof(arr)/sizeof(int));

  AddArayElem(arr, sizeof(arr)/sizeof(int), 3);
  ShowArayElem(arr, sizeof(arr)/sizeof(int));
  return 0;
}

/*
2 3 4 
4 5 6 
7 8 9
*/

 

→ ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์˜ ์ฃผ์†Œ ๊ฐ’๋งŒ ์•ˆ๋‹ค๋ฉด ์–ด๋””์„œ๋“  ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜์—ฌ ์ €์žฅ๋œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

→ ์ถ”๊ฐ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, int *param์„ ์ธ์ž๋กœ ์„ค์ •ํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ํ‘œํ˜„์œผ๋กœ int param[]๋„ ๊ฐ€๋Šฅํ•˜๋‹ค! ์™„์ „ํžˆ ๋™์ผํ•œ ์„ ์–ธ์ด๋‚˜ ํ›„์ž int param[]์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ธฐ์–ตํ•˜๊ธฐ(์ธ์ž ์ „๋‹ฌ์—๋งŒ ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„)

 

โ‘ฑ Call-by-value & Call-by-reference

 

(1) Call-by-value: ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํ˜•ํƒœ์˜ ํ•จ์ˆ˜ํ˜ธ์ถœ

ex) Swap ์˜ˆ์‹œ - ๊ฐ’์„ ์ „๋‹ฌํ•  ๋–„ ํ•จ์ˆ˜์— ๊ฐ’ ์ž์ฒด๊ฐ€ ์ „๋‹ฌ๋  ๋ฟ ์›๋ž˜ ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์›๋ž˜ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์€ ์•ˆ๋ฐ”๋€œ

#include <stdio.h>

void Swap(int n1, int n2){
  int temp = n1;
  n1 = n2;
  n2 = temp;
  printf("%d, %d\n",n1, n2);
}


int main(void) {
  int num1 = 10, num2 = 20;
  printf("Before Swap: %d, %d\n",num1, num2);

  Swap(num1, num2);
  printf("After Swap: %d, %d\n",num1, num2);
  return 0;
}
/*
Before Swap: 10, 20
20, 10
After Swap: 10, 20
*/

 

(2) Call-by-reference: ์ฃผ์†Œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํ˜•ํƒœ์˜ ํ•จ์ˆ˜ํ˜ธ์ถœ

→ ๋”ฐ๋ผ์„œ, ์ง์ ‘ ์ฃผ์†Œ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์ ‘๊ทผํ•œ๋‹ค๋ฉด ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜๊ธฐ์— ์‹ค์ œ num1๊ณผ num2 ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•˜๋ฏ€๋กœ Swap ๊ฐ€๋Šฅ

 

ex) call-by-reference๋ฅผ ์ด์šฉํ•ด ์ฃผ์†Œ๊ฐ’์œผ๋กœ ์‹ค์ œ swap์ด ๋œ ์˜ˆ์‹œ

#include <stdio.h>

void Swap(int *ptr1, int *ptr2){
  int temp = *ptr1;
  *ptr1 = *ptr2;
  *ptr2 = temp;
}


int main(void) {
  int num1 = 10, num2 = 20;
  printf("Before Swap: %d, %d\n",num1, num2);

  Swap(&num1, &num2);
  printf("After Swap: %d, %d\n",num1, num2);
  return 0;
}
/*
Before Swap: 10, 20
After Swap: 20, 10
*/

 

→ ๋”ฐ๋ผ์„œ scanf ํ•จ์ˆ˜๋„ call-by-reference ํ˜•ํƒœ์˜ ํ•จ์ˆ˜ํ˜ธ์ถœ๋กœ, ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ๋ณ€์ˆ˜์— ๊ทธ ๊ฐ’์„ ์ฑ„์šฐ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์ด ๋•Œ ์ฃผ์†Œ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ scanf์˜ ์ž…์žฅ์—์„œ ์–ด๋”” ๋ณ€์ˆ˜์— ์ฑ„์šธ ์ง€, ๋ฉ”๋ชจ๋ฆฌ์˜ ์œ„์น˜๋ฅผ ์•Œ๊ฒŒ ๋˜๋ฏ€๋กœ ํ•จ์ˆ˜์— & ์ฃผ์†Œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฑ„์šด๋‹ค. / ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ & ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ณ  scanf์— ์ „๋‹ฌํ•œ๋‹ค. ๋ฌธ์ž์—ด์ด ์ €์žฅ๋  ๋ฐฐ์—ด์€ ์ฃผ์†Œ๊ฐ€ ๋ฌธ์ž์—ด ์ด๋ฆ„ ์ž์ฒด์ด๋ฏ€๋กœ &๊ฐ€ ํ•„์š” x

 

ex) ๋ณ€์ˆ˜ num์— ์ €์žฅ๋œ ๊ฐ’์˜ ์ œ๊ณฑ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” main ํ•จ์ˆ˜ ์ž‘์„ฑ. ๋‹จ ์•„๋ž˜ ๋‘๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผ ํ•จ

→ Call-by-value ๊ธฐ๋ฐ˜์˜ SquareByValue ํ•จ์ˆ˜

→ Call-by-reference ๊ธฐ๋ฐ˜์˜ SquareByReference ํ•จ์ˆ˜

SquareByValue ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์˜ ์ œ๊ณฑ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, SquareByReference ํ•จ์ˆ˜๋Š” ์ •์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์˜ ์ œ๊ณฑ์„ ๊ทธ ๋ณ€์ˆ˜์— ๋‹ค์‹œ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

#include <stdio.h>

int SquareByValue(int n){
  return n*n;
}

void SquareByReference(int *ptr){
  (*ptr) = (*ptr)*(*ptr);
}

int main(void) {
  int num;
  printf("Enter num: ");
  scanf("%d",&num);

  printf("After Call-by-value: %d\n",SquareByValue(num));
  SquareByReference(&num);
  
  printf("After Call-by-reference: %d\n",num);
  return 0;
}

 

ex) ์„ธ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์„œ๋กœ ๋’ค๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜. ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด Swap3๋ผ๋ฉด Swap3(&num1, &num2, &num3); ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋กœ num1์— ์ €์žฅ๋œ ๊ฐ’์€ num2์—, num2์— ์ €์žฅ๋œ ๊ฐ’์€ num3์—, num3์— ์ €์žฅ๋œ ๊ฐ’์€ num1์— ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

#include <stdio.h>

void Swap3(int *ptr1, int *ptr2, int *ptr3){
  int temp;
  temp = *ptr3;
  *ptr3 = *ptr2;
  *ptr2 = *ptr1;
  *ptr1 = temp;
}

int main(void) {
  int num1, num2, num3;
  printf("Enter three nums: ");
  scanf("%d",&num1);
  scanf("%d",&num2);
  scanf("%d",&num3);

  Swap3(&num1, &num2, &num3);
  printf("After Swap: %d, %d, %d\n",num1, num2, num3);

  return 0;
}
/*
Enter three nums: 10 20 30
After Swap: 30, 10, 20
*/

 

โ‘ฒ const ์„ ์–ธ

(1) ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์˜ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” const ์„ ์–ธ (const int *ptr)

*ptr์ด ์ƒ์ˆ˜ํ™”

→ ๋งจ ์•ž์— const ํ‚ค์›Œ๋“œ๋ฅผ ์“ด๋‹ค.

→ ๋งŒ์•ฝ, const int *ptr = &num; ์ด๋ผ๋ฉด ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ *ptr = 30;์ด๋ผ๊ณ  ํ•˜๋ฉด ptr์ด num์ด ์•„๋‹Œ 30์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์˜€์œผ๋ฏ€๋กœ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ!

→ ์ฃผ์˜) ์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ num ์ž์ฒด์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์žˆ๋‹ค. ์ฆ‰, *ptr์ด ์ƒ์ˆ˜ํ™”๋˜๋ฏ€๋กœ, ptr์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

 

ex) ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด num1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ptr์ด num2๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค! ํ•˜์ง€๋งŒ ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ธ ์ฃผ์†Œ๋Š” ์–ผ๋งˆ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

#include <stdio.h>

int main(void) {
  int num = 20;
  int num2 = 30;
  const int * ptr = &num;
  ptr = &num2; // OK
  num++; // OK
  (*ptr)++; // ERROR
  printf("%d\n",*ptr);
  return 0;
}

 

(2) ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์ƒ์ˆ˜ํ™” (int * const ptr)

ptr์ด ์ƒ์ˆ˜ํ™”

→ const ์„ ์–ธ์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

→ int *const ptr = &num; ์ด๋ผ๋ฉด ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ptr ์ž์ฒด๊ฐ€ ์ƒ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ฆ‰, ํ•œ ๋ฒˆ ์ฃผ์†Œ๊ฐ’์ด ์ €์žฅ๋˜๋ฉด ๊ทธ ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋œป. ์ฆ‰, ํ•œ ๋ฒˆ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ์‹œ์ž‘ํ•œ ๋ณ€์ˆ˜๋ฅผ ๋๊นŒ์ง€ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

→ ์ฆ‰, ํฌ์ธํ„ฐ์— ๋“ค์–ด๊ฐ„ ์ฃผ์†Œ๊ฐ’์€ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ์ธํ„ฐ๋Š” ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์˜ ์œ„์น˜๋ฅผ ๋๊นŒ์ง€ ๊ฐ€๋ฆฌํ‚ค๊ณ , ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์žˆ๋‹ค. ์ฆ‰, ์œ„ ptr์—์„œ *ptr = 40์œผ๋กœ ์„ค์ •ํ•˜๋ฉด num์— 40์ด ์ €์žฅ๋œ๋‹ค.

 

ex) ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด num์ด๋ผ๋Š” ๊ฒƒ์€ ๋ฐ”๊ฟ€ ์ˆ˜๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ธ num์˜ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ 20์ด์—ˆ๋Š”๋ฐ 40์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ num ์ž์ฒด๋„ ์—ญ์‹œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ, ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

#include <stdio.h>

int main(void) {
  int num = 20;
  int num2 = 30;
  int * const ptr = &num;
  *ptr = 40; /// OK
  num = 30; // OK
  ptr = &num2; // ERROR
  printf("%d\n",*ptr);
  return 0;
}

 

(3) const ๋‘ ๊ฐœ ๋ชจ๋‘ ์‚ฌ์šฉ (const int * const ptr)

ptr์ด ์ƒ์ˆ˜ํ™” + *ptr๋„ ์ƒ์ˆ˜ํ™”

→ *ptr๋กœ๋„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์˜ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ , ptr์— ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ๋‚ด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ์–ด๋–ค ๋ณ€์ˆ˜์ธ์ง€ ์•ˆ๋‹ค๋ฉด(์˜ˆ: num), num์˜ ๊ฐ’์€ ์–ผ๋งˆ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 

- ์ •๋ฆฌํ•˜๋ฉด -

โ€ป ptr ์•ž์— const ์„ ์–ธ์„ ๋ถ™์ด๋ฉด ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํ™”์‚ดํ‘œ์˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ณ 

โ€ป int * ptr ์•ž์— const ์„ ์–ธ์„ ๋ถ™์ด๋ฉด ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ(*ptr ์‚ฌ์šฉํ•˜๋ฉด)์˜ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

 

- ๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด -

โ€ป ptr์•ž์— const ์„ ์–ธ์„ ๋ถ™์ด๋ฉด ํ™”์‚ดํ‘œ๋งŒ ๊ณ ์ •์ด์ง€, ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์˜ ๋‚ด์šฉ์€ ์–ผ๋งˆ๋“ ์ง€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

โ€ป int * ptr ์•ž์— const ์„ ์–ธ์„ ๋ถ™์ด๋ฉด ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์˜ ๋‚ด์šฉ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์„ ๋ฟ, ptr์ด ์–ผ๋งˆ๋“ ์ง€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ˜… ํ™”์‚ดํ‘œ๋„ ๊ณ ์ • / ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์˜ ๋‚ด์šฉ๋„ ๊ณ ์ •ํ•˜๋ ค๋ฉด ๋‘ ๊ตฐ๋ฐ ๋ชจ๋‘ const ์„ ์–ธ ํ•„์ˆ˜ โ˜…

 

โ‘ณ const ์„ ์–ธ์˜ ์˜๋ฏธ

const ์„ ์–ธ์„ ๋งŽ์ด ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์˜ ์•ˆ์ „์„ฑ์€ ๋†’์•„์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, PI๋Š” ๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ์•ˆ๋˜๋Š”๋ฐ ์•ž์— const ์„ ์–ธ์„ ์•ˆ๋ถ™์ด๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†๋‹ค.

 

ex) ์•„๋ž˜ ์˜ˆ์ œ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ arr์„ ๋Œ€์ƒ์œผ๋กœ const ์„ ์–ธ์„ ํ•œ ์ด์œ ?

void ShowAllData(const int* arr, int len){
  int i;
  for(i=0;i<len;i++)
    printf("%d ", arr[i]);
}

 

→ *arr์ด ๊ณ ์ •์ด๋ฏ€๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‹ค์ˆ˜๋กœ ShowAllData() ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์›๋ž˜์˜ ๋ฐฐ์—ด์š”์†Œ ๋‚ด์šฉ์„ ์‹ค์ˆ˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ฒŒ๋”, ์ฆ‰ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ฒŒ const ์„ ์–ธ์„ ํ•œ ๊ฒƒ์ด๋‹ค.

 

ex) ์•„๋ž˜์˜ ์˜ˆ์ œ์—์„œ ์ง€์ ํ• ๋งŒํ•œ ์‚ฌํ•ญ์€?

#include <stdio.h>

void ShowData(const int *ptr){
  int *rptr = ptr;
  printf("%d \n",*rptr);
  *rptr = 20;
}

int main(void) {
  int num = 10;
  int *ptr = &num;
  ShowData(ptr);
  return 0;
}

 

→ const ์„ ์–ธ์œผ๋กœ *ptr ๊ฐ’์„ ์•ˆ๋ฐ”๊พธ๊ฒŒ๋” ์„ค์ •ํ•˜์˜€๋Š”๋ฐ, rptr์„ ๋˜ ๋งŒ๋“ค์–ด *rptr๊ฐ’์„ ๋ฐ”๊พธ๊ฒŒ๋” ํ•ด์„œ const ์„ ์–ธ์ด ์†Œ์šฉ์ด ์—†์–ด์กŒ๋‹ค.

15. ๋„์ „! ํ”„๋กœ๊ทธ๋ž˜๋ฐ 2

* ๋„์ „ 1) ๊ธธ์ด๊ฐ€ 10์ธ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ , ์ด 10๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์„œ, ํ™€์ˆ˜์™€ ์ง์ˆ˜๋ฅผ ๊ตฌ๋ถ„ ์ง€์–ด ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด์ž. ์ผ๋‹จ ํ™€์ˆ˜๋ถ€ํ„ฐ ์ถœ๋ ฅํ•˜๊ณ  ๋‚˜์„œ ์ง์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜์ž. ๋‹จ, 10๊ฐœ์˜ ์ •์ˆ˜๋Š” main ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ž…๋ ฅ๋ฐ›๋„๋ก ํ•˜๊ณ , ๋ฐฐ์—ด ๋‚ด์— ์กด์žฌํ•˜๋Š” ํ™€์ˆ˜๋งŒ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์™€ ๋ฐฐ์—ด ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ง์ˆ˜๋งŒ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ ์ •์˜ํ•ด์„œ ์ด ๋‘ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์™„์„ฑํ•˜์ž.

 

- ์‹คํ–‰์˜ ์˜ˆ -

์ด 10๊ฐœ์˜ ์ˆซ์ž ์ž…๋ ฅ

์ž…๋ ฅ: 1

์ž…๋ ฅ: 2

์ž…๋ ฅ: 3

์ž…๋ ฅ: 4

์ž…๋ ฅ: 5

์ž…๋ ฅ: 6

์ž…๋ ฅ: 7

์ž…๋ ฅ: 8

์ž…๋ ฅ: 9

์ž…๋ ฅ: 0

ํ™€์ˆ˜ ์ถœ๋ ฅ: 1, 3, 5, 7, 9

์ง์ˆ˜ ์ถœ๋ ฅ: 2, 4, 6, 8, 0

#include <stdio.h>

void getOddNum(int *ptr,int len){
  printf("print odd numbers: ");
  int cnt = 0;
  for(int i = 0; i < len; i++){
    if ((*(ptr+i)) % 2 == 1){
      cnt++;
    }
  }
  for(int i = 0; i < len; i++){
    if ((*(ptr+i)) % 2 == 1){
      cnt--;
      printf("%d",*(ptr+i));
      if (cnt != 0){
        printf(", ");
      }
    }
  }
  printf("\n");
}

void getEvenNum(int *ptr,int len){
  printf("print even numbers: ");
  int cnt = 0;
  for(int i = 0; i < len; i++){
    if ((*(ptr+i)) % 2 == 0){
      cnt++;
    }
  }

  for(int i = 0; i < len; i++){
    if ((*(ptr+i)) % 2 == 0){
      cnt--;
      printf("%d",*(ptr+i));
      if (cnt != 0){
        printf(", ");
      }
    }
  }
  printf("\n");
}


int main(void) {
  printf("Enter 10 numbers\n");
  int arr[10];

  for(int i =0; i < 10; i++){
    printf("your number: ");
    scanf("%d",&arr[i]);
  }

  getOddNum(arr,sizeof(arr)/sizeof(int)); 
  getEvenNum(arr,sizeof(arr)/sizeof(int));
  
  return 0;
}

 

* ๋„์ „ 2) ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ 10์ง„์ˆ˜ ํ˜•ํƒœ๋กœ ์ •์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ž…๋ ฅ ๋ฐ›์€ ๋‹ค์Œ, ์ด๋ฅผ 2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

#include <stdio.h>

int main(void) {
  int num;
  int answer[1000];
  int i = 0;

  printf("decimal number: ");
  scanf("%d", &num);

  while (1) {
    answer[i] = num%2;
    i++;
    if((num/2) == 1){
      answer[i] = 1;
      break;
    }
    num = num/2;
  }

  for(int j = 0; j < (i+1); j++){
    printf("%d",answer[i-j]);
  }
  printf("\n");
  return 0;
}

 

* ๋„์ „ 3) ๊ธธ์ด๊ฐ€ 10์ธ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ , ์ด 10๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ๋‹จ, ์ž…๋ ฅ ๋ฐ›์€ ์ˆซ์ž๊ฐ€ ํ™€์ˆ˜์ด๋ฉด ๋ฐฐ์—ด์˜ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๊ณ , ์ง์ˆ˜์ด๋ฉด ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ

#include <stdio.h>
int main(void) {
  printf("Enter 10 numbers\n");
  int arr[10];
  int ans[10];
  int start = 0, end = 9;

  for(int i = 0; i < 10; i++){
    printf("your number: ");
    scanf("%d",&arr[i]);

    if(arr[i]%2 == 1){
      ans[start] = arr[i];
      start++;
    }
    else{
      ans[end] = arr[i];
      end--;
    }
  
  }

  for(int i = 0; i < 10; i++){
    printf("%d ", ans[i]);
  }

  printf("\n");
  return 0;
}

 

* ๋„์ „ 4) ํšŒ๋ฌธ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ํ•จ์ˆ˜ ์ •์˜. ๊ตฌํ˜„์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด์„œ ๋Œ€์†Œ๋ฌธ์ž๊นŒ์ง€ ์ผ์น˜ํ•ด์•ผ ํšŒ๋ฌธ ์ธ์ •

#include <stdio.h>

int isPalindrome(char *word, int length){
  for(int i = 0; i < (length/2); i++){
    if((*(word+i)) != (*(word+(length-1)-i))){
      return 0;
    }
  }
  return 1;
}

int main(void) {
  char word[10000];
  int length = 0;
  printf("enter your string: ");
  scanf("%s",word);

  while(word[length] != 0){
    length++;
  }
  if (isPalindrome(word,length) == 1){
    printf("this is palindrome\n");
  }
  else{
    printf("this is not a palindrome\n");
  }
  return 0;
}

 

* ๋„์ „ 5) BubbleSort ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ํ•จ์ˆ˜(DesSort; ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์ „๋‹ฌ) ๋งŒ๋“ค๊ธฐ, ๊ธธ์ด๊ฐ€ 7์ธ intํ˜• ๋ฐฐ์—ด ์„ ์–ธ: 7๊ฐœ์˜ ์ •์ˆ˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ. DesSort() ํ•จ์ˆ˜ ์ดํ›„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์˜ ์š”์†Œ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ธฐ

ex)

enter: 1

enter: 2

enter: 3

enter: 4

enter: 5

enter: 6

enter: 7

#include <stdio.h>

void DesSort(int param[], int len){
  int end = len - 1, start = 0;
  int * init = param;
  for(int k = 0; k < len; k++){
    start = 0;
    param = init;
    while(start < end){
      if(*param < *(param+1)){
        int temp;
        temp = *(param+1);
        *(param+1) = *param;
        *param = temp;
      }
      param++;
      start++;
    }
    end--;
  }
}

int main(void) {
  int arr[7];

  for(int i = 0; i < 7; i++){
    printf("enter: ");
    scanf("%d",&arr[i]);
  }

  DesSort(arr, sizeof(arr)/sizeof(int));

  for(int j = 0; j < 7; j++){
    printf("%d ",arr[j]);
  }
  printf("\n");
  return 0;
}

 

→ DesSort() ์ด๋ ‡๊ฒŒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

void DesSort(int param[], int len){
  int a, b, temp;
  for(int a = 0; a < len; a++){
    for(int b = 0; b < (len-a); b++){
      if(param[b] < param[b+1]){
        temp = param[b+1];
        param[b+1] = param[b];
        param[b] = temp;
      }
    }
  }
}

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

* ์œ„ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ๊ทธ๋ฆผ 1๊ฐœ ์ฐธ์กฐ https://pridiot.tistory.com/214

* ์œ„ ๋ฐฐ์—ด ํฌ์ธํ„ฐ ๊ทธ๋ฆผ 1๊ฐœ ์ฐธ์กฐ https://sejong-kr.libguides.com/c.php?g=942235&p=6822367 

 

๋Œ“๊ธ€