5. PointersandArrays

5.1 Pointers and Addresses

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

ANSI C์—์„œ๋Š” ํฌ์ธํ„ฐ ์‚ฌ์šฉ์ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  ์ผ๋ฐ˜์ ์ธ ํฌ์ธํ„ฐ ํ˜•ํƒœ๋กœ void*๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

ํฌ์ธํ„ฐ์™€ ์ฃผ์†Œ

๋ณดํ†ต ๋ฐฐ์—ด์€ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†์ ์œผ๋กœ ๊ธฐ๋ก๋˜๋ฉฐ ํ•œ byte๊ฐ€ ๋ฌธ์ž๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ (์ด ๋‹น์‹œ์—๋Š” ASCII๋ฅผ ์ผ๊ณ  ASCII๋Š” 7bit์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ–์œผ๋ฏ€๋กœ 8bit = byte, ํ•œ๋ฐ”์ดํŠธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งž๋‹ค) ์—ฐ์†๋œ ๋‘๊ฐœ์˜ ๋ฐ”์ดํŠธ๊ฐ€ short integer๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ(์ด ์—ญ์‹œ shortํƒ€์ž…์€ 16bit๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ), ์—ฐ์†๋œ ๋„ค๊ฐœ์˜ ๋ฐ”์ดํŠธ๊ฐ€ long integer๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ํฌ์ธํ„ฐ๋Š” ์–ด๋–ค ๋ณ€์ˆ˜์˜ ๋ฒˆ์ง€๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด c๊ฐ€ charํ˜•์ด๊ณ  ๊ทธ ํฌ์ธํ„ฐ๊ฐ€ p๋ผ๊ณ  ํ•  ๋•Œ p์˜ ๊ฐ’์€ c๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒˆ์ง€๊ฐ€ ๋œ๋‹ค.

์š”์ปจ๋Œ€ ๋‘˜๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ๊ธฐ๋ก๋œ ๊ฐ’์ด๋ฉฐ ๋ณ€์ˆ˜์ด๋‹ค. ๋‹ค๋งŒ p์˜ ๊ฐ’์€ c์˜ ์ฃผ์†Œ๋ผ๋Š” ์ ์ด ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ํ•ต์‹ฌ์ด๋‹ค.

ํ•ญ๋ชฉ

c

p

type

char

pointer

value

'a'(์ž„์˜์˜ ๋ฌธ์ž, ์—ฌ๊ธฐ์„  'a' ๋กœ ํ–ˆ๋‹ค)

25292

address

25292

35154

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ๋” ํ™•์‹คํ•˜๊ฒŒ ๋ณด์ธ๋‹ค. p๋Š” c์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์ด.

& operator (๋น„ํŠธ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค! ๋น„ํŠธ์—ฐ์‚ฐ์ž &์€ ๋‘๊ฐœ์˜ operand๋ฅผ ๋ฐ›๋Š”๋‹ค!)

ํฌ์ธํ„ฐ์˜ ํ• ๋‹น

p = &c;

&c๋Š” c์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์œ„์‹์€ p๋ผ๋Š” ๋ณ€์ˆ˜์— c์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ’์œผ๋กœ ๋‹ด์€ ๊ฒƒ์ด๋‹ค.

๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ƒ์ˆ˜๋Š”(์ด๋ฅผํ…Œ๋ฉด 123, '1') ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ๋ฐฐ์—ด์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

* operator

*์—ฐ์‚ฐ์ž๋Š” ๋ฐ˜๋Œ€ ์—ญํ• ์„ ํ•œ๋‹ค. ์ฆ‰ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— * ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ๊ทธ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค(๋•Œ๋ฌธ์— *p๋Š” ์‚ฌ์‹ค์ƒ c์™€ ๊ฐ™๋‹ค).

char c = 'a';
p = &c;

printf("%c",*p);

์ด ๋ฌธ์žฅ์—์„œ *p๋Š” 'a'๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰ p๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์ธ c์˜ ์ฃผ์†Œ๋กœ ๊ฐ€์„œ c๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์ธ 'a'๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

ํฌ์ธํ„ฐ์˜ ์„ ์–ธ

char *p;

์ œ์ผ ๋จผ์ € ์™€์•ผํ•  ์„ ์–ธ์„ ์ œ์ผ ๋’ค๋กœ ๋นผ๋Š” ์ด์œ ๋Š” ์œ„์˜ ๊ฐœ๋…๋“ค์„ ์•Œ๊ณ  ์™€์•ผ ์ด ์ˆ˜์‹์ด ์ด์ƒํ•ด๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ํฌ์ธํ„ฐ๋Š” int p์˜ ํ˜•ํƒœ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š๋Š”๋‹ค. ์˜ค๋กœ์ง€ char(ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐํ˜•) *p์˜ ํ˜•ํƒœ๋กœ ์„ ์–ธ๋œ๋‹ค.

void*

ํŠน๋ณ„ํžˆ voidํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ ์ œ์•ฝ์ด ์žˆ์ง€๋งŒ ์–ด๋–ค ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋„ ๋  ์ˆ˜ ์žˆ๋‹ค.

*p ๋Š” c์ด๋‹ค

*p๋Š” c๋Œ€์‹  ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰

int c = 1;
int *p;
p = &c;
*p = *p + 1;

์—์„œ ๋งˆ์ง€๋ง‰์ค„์€ c = c + 1๊ณผ ๊ฐ™๊ณ  c++, ++c์™€ ๊ฐ™์€ ํ‘œํ˜„์ด๋‹ค.

ํฌ์ธํ„ฐ ์—ญ์‹œ ๋ณ€์ˆ˜์ด๋‹ค

ํฌ์ธํ„ฐ ์—ญ์‹œ ๋ณ€์ˆ˜์ด๊ธฐ์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

q = p;

์ด ์‹์—์„œ q๋Š” p๊ฐ€ ๊ฐ€๋ฆฌ์ผฐ๋˜ c์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์‹์—์„œ ์ด ๊ฒƒ์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

#include <stdio.h>
int main(void) {
  int x =1 , y=2, z[10];
  int *ip;
  ip=&x; // get x address
  y=*ip; // equals to y=x; y assigned x's value, 1
  *ip=0; // equals to x=0; x assigned 0, now x == 0
  ip = &z[0]; // get z[0]'s address, now *ip == z[0]
  printf("x:%d, y:%d",x,y); // x:0, y:1
}

5.2. Pointers and Function Arguments

C์—์„œ๋Š” ํ˜ธ์ถœํ•  ๋•Œ arguments๋Š” ๊ทธ ๊ฐ’๋งŒ ์ „๋‹ฌ๋˜๋ฏ€๋กœ (call by value) ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์— ํ• ๋‹น๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด

swap(a,b);

์—์„œ swap์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด

void swap(int x, int y){
  int temp;
  temp = x;
  x = y;
  y = temp;
}

ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ swap์€ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ ๊ฐ’๋งŒ์„ ์ „๋‹ฌ ๋ฐ›์•„ ์ง€์—ญ๋ณ€์ˆ˜ x, y์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ณณ์˜ x, y์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

swap(&a,&b);

void swap(int *px, int *py){
  int temp;

  temp = *px;
  *px = *py;
  *py = temp;
}

์ด๊ฒƒ์€ &a,&b๋ฅผ ํ†ตํ•ด a,b์˜ ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ px, py์— ํ• ๋‹นํ•˜๊ณ  ์•„๋ž˜์˜ ์‹์€ ์ „์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ temp = a; a = b; b = temp;์™€ ๋™์น˜๊ฐ€ ๋œ๋‹ค.

์ฆ‰ call by value๋กœ C์–ธ์–ด์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋˜๋Š” ๊ฒƒ์€ ์–ด์ฉ” ์ˆ˜ ์—†๊ธฐ์— value์— address๋ฅผ ์‹ค์–ด ๋ณด๋‚ด ๋งˆ์น˜ ์ „์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

5.3. Pointers and Arrays

C์—์„œ ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด์€ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค. ๋ฐฐ์—ด์— ์˜ํ•œ ์—ฐ์‚ฐ์€ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ข€ ๋” ์–ด๋ ต๋‹ค.

๊ธธ์ด๊ฐ€ 10์ธ ๋ฐฐ์—ด

int a[10];

์„ ์„ ์–ธํ–ˆ์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” a[0],...,a[9]๊นŒ์ง€์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์€ ๋ณ€์ˆ˜๋ฅผ ํ•œ๋ฒˆ์— ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ , ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜์‹์  ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ๋ฅผ ํ•จ๊ป˜ ์“ฐ๋ฉด ์ข‹์€ ์ ์€ ๋ฐฐ์—ด์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š”(๋ฐ”๋กœ ์˜†์— ๋ถ™์–ด์žˆ๋Š”) ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰ a[0]์˜ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ์— 1๋งŒ ๋”ํ•˜๋ฉด a[1]์˜ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๊ฐ€ ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณด์ž.

int a[10];
int *pa; // pointer of a
pa = &a[0]; // now *pa == a[0]
x = *pa; // equals to x = a[0], if a[0]'s value was 0, x has value 0
*(pa+1) == a[1]; // 1, true

pa๋Š” a[0]์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 1๋งŒ ๋”ํ•˜๋ฉด a[1]์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ  ์—ฐ์‚ฐ์ž๋ฅผ ์“ฐ๊ฒŒ ๋˜๋ฉด `(pa+1)๋Š”a[1]`๊ณผ ๋™์น˜(equivalent)๊ฐ€ ๋œ๋‹ค.

a๋Š” a[0]์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ํฌ์ธํ„ฐ!

๋ฐฐ์—ด๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์ž์ฒด๋Š” ์ด๋ฆ„์œผ๋กœ ์“ธ ๋•Œ ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋‘ ๋ฌธ์žฅ์€ equivalent ํ•˜๋‹ค.

pa = a;
pa = &a[0];

์ฆ‰ ๋ฐฐ์—ด ์ž์ฒด๋ฅผ expression์œผ๋กœ ์“ฐ๋ฉด ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•˜๋ฉด a[i]๋Š” *(a+i)์™€ ๊ฐ™๋‹ค. ๋‹จ๊ณ„๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ๋ณด์ž.

a+i; // &a[0] + i == a[i]์˜ ์ฃผ์†Œ == &a[i]
*(a+i) // *(&a[i]) == a[i]

pa[i]๋Š” *(pa + i)์™€ ๊ฐ™๊ณ  ๊ทธ๋ƒฅ a[i]์™€ ๊ฐ™๋‹ค.

๋‹ค์‹œ ๋งํ•ด ๋ฐฐ์—ด๊ณผ ์ธ๋ฑ์Šค์˜ ํ‘œํ˜„์€ ํฌ์ธํ„ฐ์™€ ์˜คํ”„์…‹(ํ•œ์ ์œผ๋กœ ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ)์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ๊ณผ equivalentํ•˜๋‹ค!

๋ฐฐ์—ด์˜ ์ด๋ฆ„ a๋Š” ํฌ์ธํ„ฐ "์ƒ์ˆ˜"์ด๋‹ค!

์œ„ ์ฝ”๋“œ์— pa๋Š” ๋ณ€์ˆ˜์ด๋‹ค ๋‹ค์‹œ๋งํ•ด pa=a๋‚˜ pa++๊ณผ ๊ฐ™์€ ํ‘œํ˜„์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ƒ์ˆ˜์ด๋‹ค. ๋•Œ๋ฌธ์— a=pa ๋‚˜ a++๋“ฑ์˜ ํ‘œํ˜„์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋ฒˆ์—” ๋ฌธ์ž์—ด์„ ๋„˜๊ฒจ๋ฐ›์•„ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด์ž. ๋ฌธ์ž์—ด์€ char ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์›์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด๊ณ , ๋ฌธ์ž์—ด์„ ๋„˜๊ธด๋‹ค๋Š” ๊ฒƒ์€ ๊ณณ ๋ฐฐ์—ด์„ ๋„˜๊ธด๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ๋ฐฐ์—ด์„ ๋„˜๊ธด๋‹ค๋Š” ๊ฒƒ์€ ๊ณง ๊ทธ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธด๋‹ค๋Š” ๋ง์ž„์„ ์šฐ๋ฆฌ๋Š” ์ด์ œ ์•ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” charํ˜•์„ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๋ ๊ฒƒ์ด๋ฉฐ ๊ธธ์ด๋ฅผ ๋ฆฌํ„ดํ•˜๋ฏ€๋กœ int๋ฅผ ํ•จ์ˆ˜๋ช… ์•ž์— ์จ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

int strlen(char *s){
  int n;
  for(n=0; *s != '\0'; s++)
    n++;
  return n;
}

์กฐ๊ฑด *s != '\0'์€ ๋ฌธ์ž์—ด์ด ๋๋‚˜์ง€ ์•Š๋Š” ๋™์•ˆ ์ด๋ผ๋Š” ๋œป์ด๋‹ค(๋ชจ๋“  ๋ฌธ์ž์—ด์€ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— '\0'์œผ๋กœ ๋์„ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค).

์œ„์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์—๋Š” ๋‹จ์ˆœํžˆ

char a[] = "abcde";
strlen(a);

์™€ ๊ฐ™์ด ์“ฐ๋ฉด๋œ๋‹ค.

5.4. Address Arithmetic

C์˜ ์ฃผ์†Œ ์—ฐ์‚ฐ(Address Arithmetic)์€ ์•„์ฃผ ์ฒด๊ณ„์ ์ด๋‹ค. ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด ๊ทธ๋ฆฌ๊ณ  ์ฃผ์†Œ ์—ฐ์‚ฐ์ด ํ†ตํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ C์˜ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๋‹จ์ˆœํ•œ ๊ธฐ์–ต์žฅ์†Œํ• ๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. ์ด ํ”„๋กœ๊ทธ๋žจ์—๋Š” alloc(n)๊ณผ afree(p) ๋‘ ๋ฃจํ‹ด์ด ํ•„์š”ํ•˜๋‹ค. ๊ตฌ์กฐ๋Š” ๋‘ ๋ฃจํ‹ด์ด ์‚ฌ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„ allocbuf, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ allocp ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฃจํ‹ด alloc(n)(ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜)๊ณผ afree(p)(ํ•ด์ œํ•˜๋Š” ํ•จ์ˆ˜)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

alloc(n)์€ n์ด๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ›๊ณ  allocbuf์— ์—ฌ์œ ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ์กฐ์‚ฌํ•ด์•ผํ•œ๋‹ค. ์žˆ์œผ๋ฉด ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(๋™์‹œ์— ํ• ๋‹น์ „ ๋น„์–ด์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ๊ฐ€์ง„ ํฌ์ธํ„ฐ allocp๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  allocp๋ฅผ n๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ์—†์œผ๋ฉด 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.

afree(p)๋Š” p๊ฐ€ allocbuf ๋‚ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด allocp์— p์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค(p์ดํ›„๋กœ ๋ฒ„๋ฆฌ๋ฏ€๋กœ ์ด์ œ allocbuf์˜ ์ฒซ๊ณต๊ฐ„ ์ฃผ์†Œ๋Š” p์ด๊ธฐ ๋•Œ๋ฌธ).

ํ•จ์ˆ˜๋กœ ๋ณด๋ฉด ๋” ์ดํ•ด๊ฐ€ ํŽธํ•œ๋‹ค. ๋‹ค์Œ์„ ๋ณด์ž

#define ALLOCSIZE 10000

static char allocbuf[ALLOCSIZE]; //์™ธ๋ถ€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ static ์„ ์–ธ.
static char *allocp = allocbuf; //allocbuf์˜ ์ฒซ ๊ณต๊ฐ„ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ํฌ์ธํ„ฐ allocp ์„ ์–ธ.
// allocp = allocbuf ๊ฐ€ ๋งž๋Š” ์‹์ด๊ฒ ์ง€๋งŒ ํฌ์ธํ„ฐ ์„ ์–ธ์‹์ด๊ธฐ์— ์ด๋ ‡๊ฒŒ ์“ฐ์ธ ๊ฒƒ์ด๋‹ค.

char *alloc(int n){
  // ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด int์ธ ์ด์œ ๋Š” ๋ฌธ์ž char์„ ascii์ฝ”๋“œ int๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ์ด๋‹ค.
  if(allocbuf + ALLOCSIZE - allocp >= n){
    // ์œ„์˜ ์‹์€ ๋นˆ๊ณต๊ฐ„์˜ ๊ฐ€์žฅ ์ฒ˜์Œ ์ฃผ์†Œ allocp๋ฅผ ์ „์ฒด์—์„œ ๋นผ์ค€ ๊ฐ’์ด n๋ณด๋‹ค ์ปค์•ผ 
    // ์ž๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์กฐ๊ฑด์‹์œผ๋กœ ์“ด ๊ฒƒ์ด๋‹ค.
    allocp += n;
    return allocp - n;
    // ์—ฌ๊ธฐ์„œ๋Š” allocp๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ๋” ํ• ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๋”ํ•˜๊ณ  ๋‹ค์‹œ ๋บ€ ๊ฐ’์„ ๋ฆฌํ„ดํ–ˆ๋‹ค.
  }else{
    return 0;
  }
}

void afree(char *p){
  if(p>=allocbuf && p < alocbuff+ALLOCSIZE){
    // ์œ„์‹์€ 'p๊ฐ€ allocbuf์˜ ๊ณต๊ฐ„ ๋‚ด์— ์žˆ์œผ๋ฉด' ์ด๋ผ๋Š” ์กฐ๊ฑด์ด๋‹ค.
    allocp = p;
  }
}

์œ„์˜ ์ฝ”๋“œ์—์„œ ํฌ์ธํ„ฐ์˜ ๋ช‡๊ฐ€์ง€ ํŠน์ง•์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜, ํฌ์ธํ„ฐ์˜ ๊ฐ’์œผ๋กœ 0์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํฌ์ธํ„ฐ์™€ 0์„ ๋น„๊ตํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 0 ๋Œ€์‹  NULL์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

๋‘˜, ํฌ์ธํ„ฐ ๋ผ๋ฆฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ p์™€ q๊ฐ€ ๊ฐ™์€ ๋ฐฐ์—ด ๋‚ด์˜ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ผ๋ฉด ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•œ ๋น„๊ต, ์ฐจ์ด ๊ณ„์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค(ํ•œ๋งˆ๋””๋กœ ์•ž์— ์žˆ๋ƒ, ๋’ค์— ์žˆ๋ƒ, ์˜คํ”„์…‹์€ ์–ผ๋งˆ๋ƒ).

์ฃผ์˜ ์‚ฌํ•ญ

  1. ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ •์ˆ˜๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๋‹ค.

  2. ํฌ์ธํ„ฐ๋ฅผ 0๊ณผ ๋น„๊ตํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐ™์€ ๋ฐฐ์—ด ๋‚ด์˜ ๋‘ ํฌ์ธํ„ฐ๋ฅผ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜๋„ ์žˆ๋‹ค.

  3. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์™ธ๋Š” ๋ชจ๋‘ ํ•  ์ˆ˜ ์—†๋Š” ์—ฐ์‚ฐ์ด๋‹ค.

    ํ• ์ˆ˜ ์—†๋Š” ์—ฐ์‚ฐ

  4. ํฌ์ธํ„ฐ ๋ผ๋ฆฌ ๋”ํ•˜๊ธฐ, ๊ณฑํ•˜๊ธฐ, ๋‚˜๋ˆ„๊ธฐ๋“ฑ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

  5. ํฌ์ธํ„ฐ์— float์ด๋‚˜ double์„ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ๋„ ์•ˆ๋œ๋‹ค.

  6. ํฌ์ธํ„ฐ๋ฅผ ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ ํ•ด์„œ๋„ ์•ˆ๋œ๋‹ค.

  7. ํฌ์ธํ„ฐ์— ๋น„ํŠธ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

  8. cast ์—ฐ์‚ฐ์ž ์—†์ด ํƒ€์ž…์ด ์„œ๋กœ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜์—์„œ ๋‹ค๋ฅธ ํ•˜๋‚˜๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค.

์ด๊ฒƒ๋งŒ ๊ธฐ์–ตํ•˜์ž

ํฌ์ธํ„ฐ๋ผ๋ฆฌ์˜ ์—ฐ์‚ฐ์€ ์˜ค๋กœ์ง€ ๋ฐฐ์—ด ๋‚ด์˜ ์ฃผ์†Œ์™€ ๊ทธ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ์˜ ์˜คํ”„์…‹์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ฒŒ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์—†๋Š” ๊ฒƒ์ด ๊ตฌ๋ถ„๋œ๋‹ค.

5.5. Character Pointers and Functions

char amessage[] = "now is the time";
char *pmessage = "now is the time";

์–ธ๋œป ๊ฐ™์•„ ๋ณด์ด๋Š” ๋ฌธ์ž์—ด ์„ ์–ธ์ด์ง€๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

amessage๋Š” ๋ฐฐ์—ด์ด๋ฉฐ ๋์— \0์ด ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ๋ฌธ์ž๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ•ญ์ƒ ๊ฐ™์€ ์ฃผ์†Œ์— ์ €์žฅ๋œ๋‹ค. ๋ฐ˜๋ฉด pmessage๋Š” ํฌ์ธํŠธ์ด๊ณ  ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด์šฉ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค(๋ฐ”๊ฟ€์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค, ๊ทธ๋Ÿฌ๋‚˜ ์ฑ…์—์„œ ์ด์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค).

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

strcpy์˜ ์˜ˆ(string copy)

void strcpy(char *s, char *t){
  while(*s++ = *t++) ;
}

์œ„์˜ ์‹์€ ๊ฐ„๋‹จ๋ช…๋ฃŒํ•˜๊ฒŒ ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด call by value์˜ ๊ฐœ๋…์„ ํ•จ์ถ•์‹œ์ผฐ๋‹ค. ์ฆ‰, call by value๋กœ ๋ฐ›์•˜๊ธฐ์— while๋ฌธ ์•ˆ์—์„œ ++ ์—ฐ์‚ฐ์„ ํ•ด๋„ ๋ณธ๋ž˜ ํฌ์ธํ„ฐ s๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ++์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๊ฐ„ ์ฃผ์†Œ์ฐจ์ด๊ฐ€ 1์”ฉ ๋‚˜๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๋์€ \0์ด๊ณ  ์ด๋Š” 0์„ ๋ฆฌํ„ดํ•˜๋ฏ€๋กœ while๋ฌธ์ด ์ข…๋ฃŒ๋˜๋Š” ์กฐ๊ฑด์—๋„ ๋ถ€ํ•ฉ๋œ๋‹ค.

strcmp์˜ ์˜ˆ(string compare)

int strcmp(char *s, char *t){
  for(; *s == *t; s++, t++)
    if(*s == `\0`)
      return 0;
  return *s - *t;
}

๋‘ ๋ฌธ์ž์—ด์„ ์‚ฌ์ „ ์ฒ˜๋Ÿผ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜ strcmp๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํฌ์ธํ„ฐ๋งŒ ๋„˜๊ฒจ์ฃผ๊ณ  call by value๋ผ๋Š” ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

++, --์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ์Šคํƒ์˜ push, pop์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

*p++ = val; // push and add index
val = *--p; // pop top of stack

5.6. Pointer Arrays : Pointers to Pointers

ํฌ์ธํ„ฐ๋„ ์ผ์ข…์˜ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์„ค๋ช…์„ ์œ„ํ•ด์„œ ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ํ–‰์˜ ์ˆœ์„œ๋ฅผ ์‚ฌ์ „์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋ณด์ž.

๊ฐ ํ–‰์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋ฉด ํŽธํ•˜๋‹ค. ๋น„๊ต๋Š” ๋‹จ์ˆœํžˆ ๋‘ ํ–‰์˜ ํฌ์ธํ„ฐ๋ฅผ strcmp์— ๋ณด๋‚ด์ฃผ๋ฉด ๋˜๊ณ , ๋ฐ”๊พธ๊ณ ์ž ํ•  ๋•Œ๋Š” ๋ฐฐ์—ด์ƒ์˜ ํฌ์ธํ„ฐ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•จ์ˆ˜์‹์€ ์ƒ๋žตํ•œ๋‹ค. ๋‹ค๋งŒ ๋‹ค์Œ ์„ ์–ธ์ด ํฌ์ธํ„ฐ๋“ค์˜ ๋ฐฐ์—ด์ด๋‹ค.

char *lineptr[MAXLINES];

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด lineptr ๋Š” MAXLINES๊ฐœ์˜ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์š”์†Œ๋Š” "charํ˜• ๋ณ€์ˆ˜์˜ ํฌ์ธํ„ฐ"์ด๋‹ค. ์ฆ‰ lineptr[i]๋Š” (char๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”)ํฌ์ธํ„ฐ์ด๊ณ  *lineptr[i]๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•œํ–‰์˜ ์ฒซ๋ฌธ์ž์ด๋‹ค.

0x00001 => lineptr[0] => 0x31521 == "a new book"์˜ ์ฒซ๋ฒˆ์žฌ ๋ฌธ์ž 'a'์˜ ํฌ์ธํ„ฐ 
0x00002 => lineptr[1] => 0x12092 == "bravo"์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž 'b'์˜ ํฌ์ธํ„ฐ
...

์ด๋Ÿฐ์‹์ด๋‹ค. ์ฆ‰ lineptr์€ ๊ทธ ์ž์ฒด๋กœ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๊ฐ„ ์ฃผ์†Œ์ฐจ์ด๊ฐ€ 1์”ฉ๋‚˜์ง€๋งŒ, ๊ฐ ์›์†Œ๋“ค์€ ๋‹ค๋ฅธ ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•˜๋‹ค. ์œ„์˜ ์˜ˆ์‹œ๊ฐ’์„ ์ด์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์ด ์„ฑ๋ฆฝํ•œ๋‹ค.

*(lineptr + 1) == lineptr[1]
*(*(lineptr + 1) + 1) == 'r'

*(lineptr+1)์€ ๋‘๋ฒˆ์งธ ํ–‰์ธ "bravo"์˜ ์ฒซ๋ฌธ์ž 'b'์˜ ํฌ์ธํ„ฐ์ด๊ณ  ๊ฑฐ๊ธฐ๋‹ค 1์„ ๋”ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ์œผ๋‹ˆ 'r'์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

5.7. Multi-dimensionalArrays

C๋Š” ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ด์ฃผ์ง€๋งŒ ํฌ์ธํ„ฐ์˜ ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์›”-์ผ์„ ๊ทธ ํ•ด์˜ ๋ช‡๋ฒˆ์งธ ๋‚ ์งœ์ธ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜ day_of_year์™€ ๊ทธ ๋ฐ˜๋Œ€๋กœ ๊ทธ ํ•ด์˜ ๋ช‡๋ฒˆ์งธ ๋‚ ์งœ๋ฅผ ์›”-์ผ๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜ month_day๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

๋‘ ํ•จ์ˆ˜๋Š” ๊ฐ™์€ ์ •๋ณด๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ ๊ทธ ์ •๋ณด๋Š” ์–ด๋А ๋‹ฌ์ด ๋ฉฐ์น ๊ฐ€์ง€ ์žˆ๋Š”์ง€์™€ ์–ด๋А ํ•ด๊ฐ€ ์œค๋…„์ธ์ง€ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๋‘ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

static char daytab[2][13] = {
  {0,31,28,31,30,31,30,31,31,30,31,30,31},
  {0,31,29,31,30,31,30,31,31,30,31,30,31}
};
// 13๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ์›์†Œ๋กœ ํ•˜๋Š” ์‚ฌ์ด์ฆˆ 2์งœ๋ฆฌ ๋ฐฐ์—ด ์„ ์–ธ
// data type์€ int๋กœ ํ•˜๋Š”๊ฒŒ ๋งž์ง€๋งŒ charํ˜•์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ์œ„ํ•ด ์”€
// ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์€ {}์ด๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ํ•ด๋‹น ์›”์˜ ์ˆซ์ž๊ฐ€ ๊ทธ๋Œ€๋กœ ์ธ๋ฑ์Šค๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด 
// 0๋ฒˆ์งธ๋Š” 0์œผ๋กœ ๋Œ€์ž…ํ•ด์ฃผ์–ด ์ด 13์˜ ๊ธธ์ด๊ฐ€ ๋จ
int day_of_year(int year, int month, int day){
  int i, leap;
  leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
  // leap๋Š” ์œค๋…„์ด๋ฉด 1 ์•„๋‹ˆ๋ฉด 0์ด ๋œ๋‹ค.
  for(i = 1; i < month; i++){
    day+=daytab[leap][i];
    // ์œค๋…„์ธ์ง€ ์•„๋‹Œ์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ช‡๋ฒˆ์งธ ๋‹ฌ์ธ์ง€์— ๋”ฐ๋ผ daytab์˜ ์ผ์ˆ˜๊ฐ€ ๋”ํ•ด์ง„๋‹ค.
  }
  return day;
}

void month_day(int year, int yearday, int *pmonth, int *pday){
  int i, leap;
  leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
  for(i=1; yearday > daytab[leap][i]; i++){
    yearday -= daytab[leap][i]
    // ํ•ด๋‹น๋…„์˜ ๋ช‡์ผ์งผ์ง€๊ฐ€ yearday์ด๊ณ  1์›”๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ผ์ˆ˜๋ฅผ ๋นผ์ฃผ์–ด ๋ช‡์›”์ธ์ง€ ์บ์น˜ํ•œ๋‹ค.
  }
  *pmonth = i; // ์›”์„ ๋ฐ›์•„๋“ค์ธ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์— ์ž…๋ ฅํ•ด์ค€๋‹ค.
  *pday = yearday; // ์ง€๊ธˆ์€ yearday๊ฐ€ ํ•ด๋‹น ์›”์˜ ์ด ์ผ์ˆ˜๋ณด๋‹ค ์ž‘์€ ์ƒํƒœ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ๋Œ€์ž…ํ•˜๋ฉด ๋œ๋‹ค.
}

๋งŒ์•ฝ ๋‹ค์ฐจ์› ๋ฐฐ์—ด ์ž์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜์— ๋„˜๊ธธ ๊ฒฝ์šฐ์—” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์จ์ค€๋‹ค.

f(int daytab[2][13]){...}
f(int daytab[][13]){...}
// 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ฒซ๋ฒˆ์งธ index๋Š” ํฌ์ธํ„ฐ๋กœ ์ „๋‹ฌ๋˜๋ฏ€๋กœ ์จ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
f(int (*daytab)[13]){...}
// ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ํ‘œํ˜„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. a[] ์™€ *a๋Š” ์ธ์ž๋กœ์„œ equivalent์ด๋ฏ€๋กœ.
// ๋‹ค๋งŒ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๊ฐ€ []๊ฐ€ ๋” ๋†’์•„์„œ ๊ด„ํ˜ธ๋ฅผ ์จ์ฃผ์—ˆ๋‹ค.

5.8. Initialization of Pointer Arrays

๋ช‡ ๋ฒˆ์งธ ๋‹ฌ์ธ์ง€ ์•Œ๋ ค ์ฃผ๋ฉด ๊ทธ ๋‹ฌ์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜ month_name(n)์„ ๋งŒ๋“ค์–ด๋ณด์ž. ์ถœ๋ ฅ์€ ์ด๋ฆ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ํ•จ์ˆ˜ month_name์€ ๋ฌธ์ž์—ด์„ ์›์†Œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ ์ ˆํ•œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

char *month_name(int n){
  static char *name[] = {
    "Illegal month",
    "January",
    "February",
    ...
  }
  return (n < 1 || n > 12) ? name[0] : name[n];
}

๋ฌธ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์˜ ๋ฐฐ์—ด๋กœ name์„ ์„ ์–ธํ–ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์›์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์€ dataType *variableName[]๋กœ ์„ ์–ธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ๊ฐ’์„ ํ• ๋‹น(์ฆ‰, ์ดˆ๊ธฐํ™”)ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ {}๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•œ๋‹ค.

5.9. Pointers vs. Multi-dimensionalArrays

int a[10][20];
int *b[10];

๋‹ค์ฐจ์› ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ๋ฅผ ์›์†Œ๋กœํ•˜๋Š” ๋ฐฐ์—ด์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. a๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ด๋ฏ€๋กœ 200๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ํ•œ๊ณณ์— ๋ชจ์—ฌ ์ €์žฅ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ž˜์„œ a[row][col]์˜ ์œ„์น˜๋Š” ์ฒ˜์Œ์œผ๋กœ๋ถ€ํ„ฐ 20*row + col๋ฒˆ์งธ๊ฐ€ ๋œ๋‹ค. b์—์„œ๋Š” 10๊ฐœ์˜ ํฌ์ธํ„ฐ๊ฐ€ ์„ ์–ธ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋Š” ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๋‹ค. ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋ ค๋ฉด ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ฌธ์žฅ์„ ์จ์•ผํ•œ๋‹ค. b์˜ ๊ฐํฌ์ธํ„ฐ๊ฐ€ 20๊ฐœ ์š”์†Œ์˜ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค๋ฉด, ํ•„์š”ํ•œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ •์ˆ˜ 200๊ฐœ์™€ 10๊ฐœ์˜ ํฌ์ธํ„ฐ๋งŒํผ์ด ๋œ๋‹ค. ์ฆ‰ b์˜ ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ์š”๋œ๋‹ค. b์˜ ์žฅ์ ์€ ๊ฐ ํ–‰์˜ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ๋„ ๋œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด b์˜ ํฌ์ธํ„ฐ๋Š” ์š”์†Œ 20๊ฐœ์ธ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ , 20๊ฐœ๊ฐ€ ์•„๋‹Œ ๋ฐฐ์—ด๋„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ๋งŒ ๊ธฐ์–ตํ•˜์ž.

๋‹ค์ฐจ์› ๋ฐฐ์—ด์€ ์›์†Œ๊ฐ€ ๋ชจ๋‘ ์‹ค์ œ ๊ฐ’์ด๋ฉฐ, ํฌ์ธํ„ฐ ๋ฐฐ์—ด์€ ์›์†Œ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํฌ์ธํ„ฐ์ด๋‹ค.

๋”ฐ๋ผ์„œ ํฌ์ธํ„ฐ ๋ฐฐ์—ด์—์„œ ์›์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐ์—ด๊ฐ„์— ์ฃผ์†Œ์˜ ์—ฐ์†์„ฑ์€ ์—†์œผ๋ฉฐ, ํฌ์ธํ„ฐ๋„ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—(๊ฐ’์œผ๋กœ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋‹ˆ๊นŒ) ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋จน๋Š” ๊ฒƒ์ด๋‹ค.

char *name[] = {"Illegal month", "Jan", "Feb", "Mar"};
char aname[][15] = {"Illegal month", "Jan", "Feb", "Mar"};

name์˜ ๊ฒฝ์šฐ

์ธ๋ฑ์Šค

ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๊ฐ’

๊ทธ ๊ฐ’์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ

0

1023

'I'

1

4012

'J'

2

5029

'F'

3

1204

'M'

๊ฐ ์ธ๋ฑ์Šค์˜ ๊ฐ’์€ ์—ฐ์†์ ์ด์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ์ด๋ฉฐ ๊ทธ ๊ฒƒ์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

anmae์˜ ๊ฒฝ์šฐ

์ธ๋ฑ์Šค

ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๊ฐ’

๊ทธ ๊ฐ’์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ

0

0

'I'

1

15

'J'

2

30

'F'

3

45

'M'

๊ฐ ์ธ๋ฑ์Šค์˜ ๊ฐ’์€ 15์”ฉ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ์ฃผ์†Œ์ด๊ณ  ์ด๊ฒƒ์€ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์ด ๋ชจ๋‘ ์—ฐ์†์  ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋ฉฐ ํ•œ๊ณต๊ฐ„์— ๋ชจ์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰ "Illegal month"๋Š” 0~14๊นŒ์ง€์˜ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  "Jan"์€ 15~30๊นŒ์ง€์˜ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

5.10. Command-line Arguments

C๋ฅผ ์ง€์›ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ Command-line argument๋ฅผ ํ”„๋กœ๊ทธ๋žจ์— ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜ main์„ ์‹คํ–‰ํ•  ๋•Œ ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

  • argc : ๊ทธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜

  • argv : ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ๋ชจ์ž„์ธ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

์ด๋Ÿฐ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ๋ณดํ†ต ๋ช‡์ค‘์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. echo๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

echo hello, world

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

hello, world

argv[0]์€ ํ”„๋กœ๊ทธ๋žจ ์ž์‹ ์˜ ์ด๋ฆ„์— ์“ฐ์ธ๋‹ค. ๋”ฐ๋ผ์„œ argc๋Š” ์ตœ์†Œ 1๊ฐœ๊ฐ€ ๋œ๋‹ค. argc๊ฐ€ 1์ด๋ผ๋Š” ๋ง์€ ์ปค๋งจ๋“œ ๋ผ์ธ์œผ๋กœ ๋ถ€ํ„ฐ์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. ์œ„์˜ echo ์˜ˆ๋Š” argc๊ฐ€ 3์ด๋ฉฐ argv[0]์€ "echo", argv[1]์€ "hello", argv[2]์€ "world"์ด๋‹ค. ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” argv[1]์ด๊ณ  ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” argv[argc-1]์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  argv[argc]๋Š” null ํฌ์ธํ„ฐ๊ฐ€ ๋œ๋‹ค.

argv๋กœ ๋“ค์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž

#include <stdio.h>

int main(int argc, char *argv[]){
  while(--argc>0)
    // argc๋Š” ์‚ฌ์ด์ฆˆ์ด๋ฏ€๋กœ 1์„ ๋นผ๊ณ  ์‹œ์ž‘ํ•ด์•ผ ์ธ๋ฑ์Šค๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
    // ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ƒฅ ์ „์ฒด์‚ฌ์ด์ฆˆ ๋ณด๋‹ค ํ•œ๋ฒˆ ๋œ ๋Œ๊ฒŒ ๋งŒ๋“ค๊ธฐ์œ„ํ•ด ์“ฐ์˜€๋‹ค.
    // ๊ทธ๋ƒฅ ++argv๋ฅผ ์ € ์ž๋ฆฌ์— ๋„ฃ๊ณ  ๋ฐ‘์— *argv๋ฅผ ํ•ด์ฃผ๋Š”๊ฒŒ ๋” ๊ฐ€๋…์„ฑ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
    printf("%s%s", *++argv, (argc>1) ? " " : " ");
    // argv[0]์€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„(์—ฌ๊ธฐ์—์„  main)์ด๋ฏ€๋กœ
    // 1์„ ๋”ํ•œ ๊ฒƒ๋ถ€ํ„ฐ ์จ์ฃผ์–ด์•ผ ์ธ์ž๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  printf("\n");
  return 0;
}

์ด๋ฒˆ์—” ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด๋‚ด์— ํŒจํ„ด์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์ž. ํŒจํ„ด์€ ์ปค๋งจ๋“œ๋ผ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.

#include <stdio.h>
#include <string.h>
#define MAXLINE 1000

int getline(char *line, int max); // ๋ฉ”์ธ์—์„œ ์“ฐ๊ธฐ ์œ„ํ•ด ์„ ์–ธ๋งŒ ํ•ด๋†“์•˜๋‹ค.
// ๊ทธ์ „ ์ฑ•ํ„ฐ์— ์ด ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌํŠผ ์ž…๋ ฅ๋ฌธ์ž์—ด์„ ๋ฐ›๋Š” ํ•จ์ˆ˜

main(int argc, char *argv[]){
  char line[MAXLINE];
  int found = 0;

  if(argc != 2)
    printf("Usage : find pattern\n");
    // ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ 1๊ฐœ์˜ ํŒจํ„ด์„ ๋ฐ›์•„์•ผ ํ•˜๋‹ˆ๊นŒ argc๊ฐ€ 2์—ฌ์•ผ ํ•œ๋‹ค.
    // ๊ทธ๊ฒŒ ์•„๋‹๋•Œ ํŒจํ„ด ์ฐพ๋Š”๊ฑฐ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ๋‹ค.
  else
    while(getline(line,MAXLINE)>0)
      // EOF๊ฐ€ ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋ฌธ์ž์—ด์„ ๋ฐ›๋Š”๋‹ค.
      if(strstr(line,argv[1])!=NULL){
        // strstr์€ line๋‚ด argv[1]์ด ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
        // ๋ชป ์ฐพ์œผ๋ฉด NULL์„ ๋ฆฌํ„ดํ•œ๋‹ค.
        printf("%s", line);
        // ๊ทธ๋ฆฌ๊ณ  ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ๊ฐ€์ง„ ๋ฌธ์žฅ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        found++;
      }
  return found;
  // ์—ฌ๊ธฐ์„œ๋Š” ์ด ๋ช‡๋ฒˆ ๋“ฑ์žฅํ•˜๋Š”์ง€๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.
}

์ด๋ฒˆ์—” optional argument๋ฅผ ๋ถ™์—ฌ๋ณด์ž. command line์—์„œ -๋ฅผ ๋ถ™์—ฌ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ์ข…์˜ ์Šค์œ„์น˜๊ฐ™์€ ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ ๋‘๊ฐœ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

  • -x : ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ผ์ธ์„ ์ถœ๋ ฅํ•˜๋Š” ์˜ต์…˜

  • -n : ํ–‰์˜ ๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋Š” ์˜ต์…˜

์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด

find -x -n pattern

์€ "ํŒจํ„ด์ด ๋งž์ง€ ์•Š๋Š” ํ–‰"์„ "ํ–‰๋ฒˆํ˜ธ์™€ ํ•จ๊ป˜ ์ถœ๋ ฅ"ํ•  ๊ฒƒ์ด๋‹ค. ์„ ํƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์–ด์จ๋„ ๊ดœ์ฐฎ์•„์•ผ ํ•˜๊ณ , ๋ฌถ์–ด์„œ ์จ๋„ ๊ดœ์ฐฎ์•„์•ผํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด์šฉ์€ ์„ ํƒ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

#include <stdio.h>
#include <string.h>
#define MAXLINE 1000

int getline(char *line, int max);

main(int argc, char *argv[]){
  char line[MAXLINE]; // ํ•œ ํ–‰์”ฉ ์ €์žฅํ•  ๋ณ€์ˆ˜
  long lineno = 0; // ํ–‰๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ณ€์ˆ˜
  int c, except = 0, number = 0, found = 0;
  // -x์— ๋Œ€ํ•œ ์Šค์œ„์น˜ ์—ญํ• ์„ ํ•˜๋Š” except ๋ณ€์ˆ˜
  // -n์— ๋Œ€ํ•œ ์Šค์œ„์น˜ ์—ญํ• ์„ ํ•˜๋Š” number ๋ณ€์ˆ˜
  // ์ด ์ฐพ์€ ์นด์šดํŠธ๋ฅผ ์˜๋ฏธํ•˜๋Š” found
  // ์ปค๋งจ๋“œ๋ผ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ ๋…€์„์„ ๋ฌธ์ž 1๊ฐœ ์”ฉ ์ €์žฅํ•  c
  while(--argc > 0 && (*++argv)[0] == '-')
    // ๋จผ์ € ๋ฐ›์•„๋“ค์ธ ์ธ์ž๋“ค ์ค‘ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ '-'์ธ ์ธ์ž๋ฅผ ์ฐพ๋Š”๋‹ค.
    while(c = *(++argv[0]))
      // ๊ทธ๋Ÿผ ๊ทธ ์ธ์ž์˜ ๋‘๋ฒˆ์งธ ๋ฌธ์ž๋ถ€ํ„ฐ(++argv[0]์ด๋ฏ€๋กœ) ๋งˆ์ง€๋ง‰๊นŒ์ง€๋ฅผ ๋ฃจํ”„๋กœ ๋Œ๋ ค๋ณธ๋‹ค.
      switch(c){
        case 'x':
          except = 1;
          break;
          // 'x'์˜ต์…˜์ผ๊ฒฝ์šฐ except๋ฅผ 1๋กœ ๋งŒ๋“ค์–ด ์ถ”ํ›„์— ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.
        case 'n':
          number = 1;
          break;
          // 'n'์˜ต์…˜์ผ๊ฒฝ์šฐ number๋ฅผ 1๋กœ ๋งŒ๋“ค์–ด ์ถ”ํ›„์— ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.
        default:
          printf("find: illegal option %c\n", c);
          argc = 0;
          found = -1;
          // ๊ทธ์™ธ์— '-'๋’ค์— ๋ถ™์€ ๋ฌธ์ž๋“ค์€ ์˜ต์…˜์ด ์•„๋‹ˆ๋ฏ€๋กœ argc๋ฅผ 0์œผ๋กœ๋งŒ๋“ค์–ด
          // ๋’ค์ด์–ด ์˜ฌ ์กฐ๊ฑด๋ฌธ์—์„œ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ฉฐ 
          // found๋ฅผ -1๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
          break;
      }
  if(argc != 1)
    printf("Usage: find -x -n pattern\n");
    // ์œ„์—์„œ --argc > 0  ๋ฃจํ”„๋ฅผ ๋Œ์•„์„œ ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ argc๋Š” 1์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
  else
    while(getling(line,MAXLINE) > 0){
      // ์—ญ์‹œ EOF๊นŒ์ง€ ํ–‰์„ ์ฝ์œผ๋ฉฐ
      lineno++;
      // ํ–‰๋ฒˆํ˜ธ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
      if((strstr(line,*argv)!=NULL) != except){
        // (strstr(line,*argv)!=NULL)์—์„œ
        // ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๋ฉด 1์ด ๋ฆฌํ„ด๋˜๊ณ  
        // except๊ธฐ 0 ์ด์—ˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ์ถœ๋ ฅ๋˜์ง€๋งŒ
        // except๊ฐ€ 1 ์ธ๊ฒฝ์šฐ ๊ด„ํ˜ธ์•ˆ์˜ expression์ด 0์ผ ๋•Œ ์ฆ‰,
        // ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฏ€๋กœ ์˜๋„์— ๋งž๋‹ค.
        if(number)
          // ํ–‰๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์˜ต์…˜์„ ๋„ฃ์„ ๊ฒฝ์šฐ number๊ฐ€ 1์ด ๋˜๋ฏ€๋กœ ์•„๋ž˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
          printf("%ld:",lineno);
        printf("%s",line);
        found++;
      }
    }
  return found;
}

5.11. Pointers to Functions

C์—์„œ ํ•จ์ˆ˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ํ•จ์ˆ˜์˜ ํฌ์ธํ„ฐ๋Š” ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํฌ์ธํ„ฐ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐฐ์—ด์˜ ์›์†Œ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

5.6์ ˆ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ ์ณ optional argument -n์ด ์žˆ์œผ๋ฉด ์ •๋ ฌ์ด ์‚ฌ์ „์‹์ด ์•„๋‹ˆ๋ผ ์ˆซ์ž ํฌ๊ธฐ ์ˆœ์œผ๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

์ •๋ ฌ์€ ํฌ๊ฒŒ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค. 1. ๋‘ ๋Œ€์ƒ์„ ๋น„๊ตํ•˜๋Š” ๋ถ€๋ถ„ 2. ๋‘ ๋Œ€์ƒ์ฒด์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š” ๋ถ€๋ถ„ 3. ์ „์ฒด์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋กœ ๋  ๋•Œ๊นŒ์ง€ ๋น„๊ต์™€ ๊ตํ™˜์„ ๊ณ„์†ํ•˜๋Š” ๋ถ€๋ถ„

์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ์ˆซ์ž์ •๋ ฌ๊ณผ ์‚ฌ์ „์‹ ์ •๋ ฌ์˜ ๋‘๊ฐ€์ง€ ๋™์ž‘์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋น„๊ตํ•˜๋Š” ๋ถ€๋ถ„์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋‘ ํ–‰์„ ์‚ฌ์ „์‹์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ strcmp๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ  ์ˆซ์ž ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ numcmp๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ๋‘˜๋‹ค int ์ถœ๋ ฅ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <stdio.h>
#include <string.h>

#define MAXLINES 5000
char *lineptr[MAXLINES];

int readlines(char *lineptr[], int nlines);
int writelines(char *lineptr[], int nlines);

void qsort(void *lineptr[], int left, int right, int (*comp)(void *,void *));
int numcmp(char *, char *);

main (int argc, char *argv[]){
  int nlines;
  int numeric = 0; // ์ปค๋งจ๋“œ๋ผ์ธ '-n'์˜ต์…˜์— ๋”ฐ๋ผ 1์ด ๋˜๊ณ  ์ˆซ์ž์ •๋ ฌ์ด ๋œ๋‹ค.

  if(argc > 1 && strcmp(argv[1],"-n") == 0){
    // strcmp ๊ฐ’์ด 0์ด๋ผ๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ 
    // -n ์˜ต์…˜์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ฌธ์ด๋‹ค.
    numeric = 1;
  }

  if((nlines = readlines(lineptr,MAXLINES))>=0){
    qsort((void **) lineptr, 0, nlines-1, (int (*)(void*, void*)) (numeric ? numcmp : strcmp));
    writelines(lineptr,nlines);
    return 0;
  }else{
    printf("input too big to sort\n");
    return 1;
  }
}

qsort์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์•„์ฃผ ๋ณต์žกํ•œ ์œ ํ˜•์ด ๋ˆˆ์— ๋ˆ๋‹ค.

int (*comp)(void *,void *)

๋Œ€๊ฐ• int๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํฌ์ธํ„ฐ์ธ๋ฐ ์ข€ ๋ณต์žกํ•ด ๋ณด์ธ๋‹ค. (comp)๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ค์ œ ๊ฐ’์ด๋ž‘ ๊ฐ™๋‹ค๋Š” ๊ฑธ ๋– ์˜ฌ๋ฆฌ์ž. ๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ”๊ฟ” ๋ณผ ์ˆ˜ ์žˆ๋‹ค. `int something(void , void *)` ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”๊ฐ€? ๊ทธ๋ ‡๋‹ค. ์ •ํ™•ํžˆ ํ•จ์ˆ˜๋ฆฌํ„ฐ๋Ÿด์ด๋‹ค.

Javascript์—์„œ์˜ callback function์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ ํฌ์ธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ €๋Ÿฐ ๋ฌธ๋ฒ•์„ ์“ด ๊ฑฐ๋‹ค. ์ €๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•ด์คŒ์œผ๋กœ์จ compareํ•จ์ˆ˜๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋“  ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‹ค๋งŒ ๊ทธ ํ˜•์‹์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‘๊ฐœ๋ฅผ ๋ฐ›์•„์„œ ์ •์ˆ˜ํ˜• ๋ฆฌํ„ด์„ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ผ๋Š” ์ œํ•œ๋งŒ์„ ๊ฑธ์–ด๋’€์„ ๋ฟ.

qsortํ•จ์ˆ˜๋ฅผ ๋ณด์ž

void qsort(void *v[], int left, int right, int (*comp)(void *, void *)){
  int i, last;
  void swap(void *v[], int, int);

  if(left >= right)
    return;
  swap(v, left, (left+right)/2);
  last = left;
  for(i=left+1; i<= right; i++)
    if((*comp)(v[i],v[left])<0)
      swap(v, ++last, i);
  swap(v, left, last);
  qsort(v, left, last-1, comp);
  qsort(v, last+1, right, comp);
}

qsort์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•ž์ ˆ์—์„œ ๋‹ค๋ฃจ์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ํ•จ์ˆ˜์˜ ํฌ์ธํ„ฐ comp๋ฅผ qsortํ•จ์ˆ˜๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๋ณด์ž. if((*comp)(v[i],v[left])<0)์—์„œ comp๋Š” ํ•จ์ˆ˜์˜ ํฌ์ธํ„ฐ์ด๋ฏ€๋กœ *comp๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ๋˜์–ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ด„ํ˜ธ๋Š” ๊ผญ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

int *comp(void *, void*);
int (*comp)(void *, void*);

๋Š” ๋‹ค๋ฅด๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” comp๊ฐ€ ํ•จ์ˆ˜์ธ๋ฐ ๋ฆฌํ„ด ๊ฐ’์ด ์ •์ˆ˜์˜ ํฌ์ธํ„ฐ๋ผ๋Š” ๋œป์ด๋‹ค. ๋‘๋ฒˆ์งธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜์˜ ํฌ์ธํ„ฐ์ด๋‹ค.

5.12. Complicated Declarations

ํฌ์ธํ„ฐ ๊ฐœ๋…์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ค‘์ฒฉํ•ด์„œ ์“ธ ์ˆ˜๋ก ์„ ์–ธ๋ฌธ์€ ์•„์ฃผ ๋ณต์žกํ•ด์ง„๋‹ค. ๋‹ค์Œ ๋‘ ์„ ์–ธ๋ฌธ์€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.

int *f(); // ์ •์ˆ˜ํ˜• ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” "ํ•จ์ˆ˜"
int (*pf)(); // ์ •์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์˜ "ํฌ์ธํ„ฐ"

๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์„ ์–ธ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” 6.7์ ˆ์—์„œ ๋‹ค๋ฃฐ typedef๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ ํ•˜๋‚˜๋Š” ์„ ์–ธ๋ฌธ์„ ๋ง๋กœ ํ‘œํ˜„ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์™€ ๊ทธ ์—ญ๋™์ž‘์„ ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

์šฐ์„  ์„ ์–ธ๋ฌธ์„ ์„ค๋ช…์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜ dcl์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค. ์‹คํ–‰ ์‚ฌ๋ก€ ๋ช‡๊ฐ€์ง€๋ฅผ ๋ณด์ž.

char **argv
  argv : pointer to pointer to char
int (*daytab)[13]
  daytab : pointer to array[13] of int
int *daytab[13]
  daytab : array[13] of pointer to int
void *comp()
  comp : function returning pointer to void
void (*comp)()
  comp : pointer to function returning void
char (*(*x())[])()
  x: function returning pointer to array[] of pointer to function returning char

dcl์€ C์˜ ์„ ์–ธ์— ๊ด€ํ•œ ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dcl :         optional *'s direct-dcl
direct-dcl :  name
              (dcl)
              direct-dcl()
              direct-dcl[optional size]

ํ•˜๋‚˜์˜ dcl์€ ํ•˜๋‚˜์˜ direct-dcl์•ž์— *๊ฐ€ ๋ถ™์–ด ํฌ์ธํ„ฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๊ณ . direct-dcl๋’ค์— ()๋‚˜ []๊ฐ€ ๋ถ™๋Š” ๊ฒƒ๋„ direct-dcl์ด๋‹ค.

์—ฌํŠผ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํฌ์ธํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด์„œ ๋ณต์žกํ•ด์ง€๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ์„ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ํ•ด์„ํ•ด์ฃผ๋Š” ๊ฒƒ์ด dclํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ๊ทธ๊ฒŒ ์ „๋ถ€๋‹ค.

Last updated

Was this helpful?