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
๊ฐ ๊ฐ์ ๋ฐฐ์ด ๋ด์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ผ๋ฉด ๋น๊ต์ฐ์ฐ์๋ฅผ ํตํ ๋น๊ต, ์ฐจ์ด ๊ณ์ฐ์ ํ ์ ์๋ค(ํ๋ง๋๋ก ์์ ์๋, ๋ค์ ์๋, ์คํ์
์ ์ผ๋ง๋).
์ฃผ์ ์ฌํญ
ํฌ์ธํฐ์ ๋ํ ์ ์๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ์ ์๋ค.
ํฌ์ธํฐ๋ฅผ 0๊ณผ ๋น๊ตํ ์๋ ์๊ณ ๊ฐ์ ๋ฐฐ์ด ๋ด์ ๋ ํฌ์ธํฐ๋ฅผ ๋น๊ตํ๊ฑฐ๋ ๋บ ์๋ ์๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ธ๋ ๋ชจ๋ ํ ์ ์๋ ์ฐ์ฐ์ด๋ค.
ํ ์ ์๋ ์ฐ์ฐ
ํฌ์ธํฐ ๋ผ๋ฆฌ ๋ํ๊ธฐ, ๊ณฑํ๊ธฐ, ๋๋๊ธฐ๋ฑ์ ํ ์ ์๋ค.
ํฌ์ธํฐ์ float์ด๋ double์ ๋ํ๊ฑฐ๋ ๋นผ์๋ ์๋๋ค.
ํฌ์ธํฐ๋ฅผ ๊ณฑ์ , ๋๋์ ํด์๋ ์๋๋ค.
ํฌ์ธํฐ์ ๋นํธ์ฐ์ฐ์ ํ๋ฉด ์๋๋ค.
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
์ ๊ฒฝ์ฐ
name
์ ๊ฒฝ์ฐ์ธ๋ฑ์ค
ํด๋น ์ธ๋ฑ์ค์ ๊ฐ
๊ทธ ๊ฐ์ด ๊ฐ๋ฆฌํค๋ ๊ฒ
0
1023
'I'
1
4012
'J'
2
5029
'F'
3
1204
'M'
๊ฐ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฐ์์ ์ด์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ฃผ์์ด๋ฉฐ ๊ทธ ๊ฒ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
anmae
์ ๊ฒฝ์ฐ
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?