์ธ์ ์ ๋ฌ ๋ฐฉ๋ฒ
1. ๊ฐ์ ์ํ ์ ๋ฌ
- ์ธ์ ์ ๋ฌ์ ๊ธฐ๋ณธ๋ฐฉ์์ ๊ฐ์ '๋ณต์ฌ'์ด๋ค.
- ๊ฐ์ ๋ณต์ฌํด์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ํธ์ถํ๋ ํจ์์ ๊ฐ์ ๋ฐ๋์ง ์๋๋ค.
- ๊ฐ์ ์ํ ์ ๋ฌ(Call-by-value): ํจ์๋ฅผ ํธ์ถํ ๋ ๋จ์ํ ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌํ๋ ํจ์ํธ์ถ
#include <stdio.h>
void add(int a); // ํจ์ ์ ์ธ
int main(void)
{
int num = 10;
add(num); // ํจ์ ํธ์ถ
printf("num : %d\n",num);
return 0'
}
void add(int a) // ํจ์ ์ ์
{
a = a + 5;
}
์คํ๊ฒฐ๊ณผ
num : 10
- ํจ์๊ฐ ๋ฐํ๋ ์ดํ์๋ ํธ์ถํ ํจ์์ ์๋ ๋ณ์์ ๊ฐ์ ๋ณํ์ง ์๋๋ค.
- ์๋ํ๋ฉด ๋งค๊ฐ๋ณ์ a์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ๋ ๊ฐ์ main ํจ์๋ก ๋๊ฒจ์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
2. ์ฐธ์กฐ์ ์ํ ์ ๋ฌ
- ์ฐธ์กฐ์ ์ํ ์ ๋ฌ์ ์ธ์๋ก ๋ณ์์ ๊ฐ์ ์ ๋ฌํ๋ ๊ฒ์ด ์๋, ์ฃผ์๊ฐ์ ์ ๋ฌํ๋ค.
- ์ฐธ์กฐ์ ์ํ ์ ๋ฌ(Call-by-reference): ์ฃผ์๊ฐ์ ์ ๋ฌํ๋ ํจ์ํธ์ถ
- ์ด ๋ฐฉ๋ฒ์ ์ธ์๋ก ์ ๋ฌ๋ ๋ณ์์ ๊ฐ์ ํจ์ ๋ด์์ ๋ณ๊ฒฝํ ์ ์๋ค.
#include <stdio.h>
void add(int *a); // ํจ์ ์ ์ธ
int main(void)
{
int num = 10;
add(&num); // ํจ์ ํธ์ถ
printf("num : %d\n", num);
return 0;
}
void add(int *a) // ํจ์ ์ ์
{
*a = *a + 5;
}
์คํ๊ฒฐ๊ณผ
num : 15
- ๋ณ์์ ์ฃผ์๊ฐ์ ์ธ์๋ก ๋ฐ์ ํด๋น ๋ณ์์ ์ง์ ์ ๊ทผํ๋ค.
- add ํจ์์ ๋งค๊ฐ๋ณ์์ธ a๋ num์ ๊ฐ๋ฆฌํค๊ณ , *a๋ num์ ์๋ฏธํ๋ค.
- ๋ฐ๋ผ์ main ํจ์์ ์๋ num์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๊ทธ ๊ฐ์ ๋ฐ๊พธ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๋ฐฐ์ด์ ํจ์์ธ์๋ก ์ ๋ฌํ๊ธฐ
- ๋ฐฐ์ด์ ํต์งธ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์๋ค.
- C์ธ์ด๋ ๋งค๊ฐ๋ณ์๋ก ๋ฐฐ์ด์ด ์ ์ธ๋๋ ๊ฒ์ ํ์ฉํ์ง ์์์ ํจ์์ ์ธ์๋ก ๋ฐฐ์ด์ ์ ๋ฌํ์ง ๋ชปํ๋ค.
- ๋ฐฐ์ด์ ํต์งธ๋ก ์ ๋ฌํ์ง ์๋ ๋์ ๋ฐฐ์ด์ ์ฃผ์๊ฐ์ ์ ๋ฌํ ์ ์๋ค.
- ๋ฐฐ์ด์ ์ด๋ฆ์ ํฌ์ธํฐ์ด๋ฏ๋ก ๋ฐฐ์ด์ ์ด๋ฆ์ด ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
โถ ๋ฐฐ์ด์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ค๋ฉด () ๊ดํธ ์์์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ ๋ค์ [] ๋๊ดํธ๋ฅผ ๋ถ์ด๊ฑฐ๋ ๋งค๊ฐ๋ณ์๋ฅผ *ํฌ์ธํฐ๋ก ์ง์ ํด์ค๋ค.
๋ฐํํ ํจ์์ด๋ฆ(์๋ฃํ ๋งค๊ฐ๋ณ์[])
{
}
๋ฐํํ ํจ์์ด๋ฆ(์๋ฃํ *๋งค๊ฐ๋ณ์)
{
}
#include <stdio.h>
void arrprintf(int *arg);
int main(void)
{
int arr[3] = {10, 20, 30};
arrprintf(arr); // ๋ฐฐ์ด์ ์ด๋ฆ์ด ์ง๋๊ณ ์๋ ์ฃผ์๊ฐ ์ ๋ฌ
return 0;
}
void arrprintf(int *arg)
{
int i;
for(i = 0; i < 3; i++)
printf("%d ", arg[i]); // arg๋ผ๋ ์ด๋ฆ์ ๋ฐฐ์ด์ ์ด๋ฆ์ฒ๋ผ ์ฌ์ฉ
printf("\n");
}
์คํ๊ฒฐ๊ณผ
10 20 30
- int *arg์ int arg[]๋ ๋์ผํ ์ ์ธ์ด๋ค.
- int arg[]๊ฐ ๋ฐฐ์ด์ด ์ธ์๋ก ์ ๋ฌ๋๋ค๋ ๋๋์ ๋ ๊ฐํ๊ฒ ์ค๋ค
- ๋ฐ๋ผ์ ๋ฐฐ์ด์ ์ฃผ์๊ฐ์ด ์ธ์๋ก ์ ๋ฌ๋ ๋๋ int arg[] ํํ์ ์ ์ธ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
ํจ์์ ํฌ์ธํฐ
- ํจ์ ์ด๋ฆ์ ํจ์๊ฐ ์ ์๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์์น์ด๋ค.
- ํจ์ ์ด๋ฆ๋ ํฌ์ธํฐ์ด๋ฏ๋ก printf์์ ์ถ๋ ฅํด ๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋์จ๋ค.
#include <stdio.h>
void hello(void);
int main(void)
{
printf("%p\n",hello);
return 0;
}
void hello(void)
{
printf("Hello, world!\n");
}
์คํ๊ฒฐ๊ณผ
008613BB
<ํจ์ ํฌ์ธํฐ ๋ณ์ ์ ์ธ>
๋ฐํ๊ฐ์๋ฃํ (*ํจ์ํฌ์ธํฐ์ด๋ฆ) (๋งค๊ฐ๋ณ์ ์๋ฃํ)
#include <stdio.h>
int add(int num1, int num2);
int main(void)
{
int (*fptr)(int, int); // intํ ๋ฐํ๊ฐ, intํ ๋งค๊ฐ๋ณ์ ๋ ๊ฐ๊ฐ ์๋ ํจ์ ํฌ์ธํฐ fptr ์ ์ธ
fptr = add; // add ํจ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํจ์ ํฌ์ธํฐ fptr์ ์ ์ฅ
printf("%d\n", fptr(10, 20)); // ํจ์ ํฌ์ธํฐ๋ก add ํจ์ ํธ์ถ
return 0;
}
int add(int num1, int num2) // intํ ๋ฐํ๊ฐ, intํ ๋งค๊ฐ๋ณ์ ๋ ๊ฐ
{
return num1 + num2;
}
์คํ๊ฒฐ๊ณผ
30
- ํจ์๊ฐ ๋ฐํํ์ด intํ์ด๊ณ ๋งค๊ฐ๋ณ์๋ก intํ ๋ณ์๊ฐ ๋ ๊ฐ ์ ์ธ๋์์ผ๋, ์ด ํจ์์ ์ฃผ์ ๊ฐ ์ ์ฅ์ ์ํ ํจ์ ํฌ์ธํฐ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ค.
โถ ๊ตณ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ์ฐ์ง ์์๋ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ฌ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
ํ์ง๋ง, ํจ์ ํฌ์ธํฐ๋ ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ , ๋์ค์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณณ์์ ์ฐ์ฐ ๋ฐฉ๋ฒ์ ํจ์๋ก ๊ตฌํํ ๋ ์ธ ์ ์๋ค.
๋ํ, ํ๋์ ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์์ ๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์ ์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํจ์ ํฌ์ธํฐ๋ฅผ ์ธ ์๋ ์๋ค.
์ถ์ฒ: https://sejong-kr.libguides.com/c.php?g=942235&p=6822368