C์ธ์ด์ ํฌ์ธํฐ๋ ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ก ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ง์ ์ ๊ทผํ๊ฑฐ๋ ๋ค๋ฅธ ๋ณ์์ ๊ฐ์ ๊ฐ์ ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ค.
Javascript์์ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด(Heap Memory) ์ ๊ณต๊ฐ์ด ํ ๋น๋๋๊ฒ ๊ณผ ๊ฐ์.
์ด๋ฅผ C์ธ์ด์์๋ ํฌ์ธํฐ ๊ฐ๋
์ ์ฌ์ฉํ์ฌ ์ง์ ์ฃผ์๋ฅผ ์ ๊ทผํ์ฌ ์กฐ์ํ ์๊ฐ ์์.
์๋ฃํ *ํฌ์ธํฐ_๋ณ์๋ช
= &๋ณ์๋ช
;
์๋ฃํ* ํฌ์ธํฐ_๋ณ์๋ช
= &๋ณ์๋ช
;
// *๋ ์๋ฃํ or ํฌ์ธํฐ_๋ณ์๋ช
์ด๋์ชฝ์ด๋ ๋ถ์ฌ๋ ์๊ด์์
๋ฉ๋ชจ๋ฆฌ ์ฃผ์ : ๋ชจ๋ ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฉฐ, ๊ฐ ๋ณ์๋ ๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
ํฌ์ธํฐ ๋ณ์ : ํฌ์ธํฐ๋ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ก ์ด๋ฅผ ํตํด ๋ค๋ฅธ ๋ณ์๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ฐธ์กฐํ๊ณ ์กฐ์ํ ์ ์๋ค.
์ญ์ฐธ์กฐ(Dereferencing) : ํฌ์ธํฐ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ๋ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ ์ญ์ฐธ์กฐ๋ผ๊ณ ํ๋ฉฐ * ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
#include <stdio.h>
int main(){
int a = 100; // a๋ผ๋ ๋ณ์์ 100์ ํ ๋น
int* b = &a // ํฌ์ธํฐ๋ณ์ b๋ a์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํด
printf("%d %d" , *b, *(&a)); // 100 100
return 0
}
*b ๋ ํ์ฌ a์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํค๊ณ ์์์ผ๋ก 100 ์ถ๋ ฅ
*(&a) ๋ a์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํค๊ณ ์์์ผ๋ก 100 ์ถ๋ ฅ
*(&a)์์ *๋ ์ฃผ์๊ฐ์ ํด๋น๋๋ ๊ฐ์ ์๋ฏธํ๊ณ &๋ ์ฃผ์๊ฐ์ ์๋ฏธํจ์ผ๋ก * ์ &๋ ์๋ก ์๋ฐ๋จ์ผ๋ก ์์๋๋ค.
์๋ฐ๋๋ ๊ฒ์ด ์๋ก ์ํฅ์ ๋ฐ์ ํจ๊ณผ๊ฐ ์์ด์ง๋ค๋ ์๋ฏธ
๋ฐฐ์ด์ i๋ฒ์ง ์ฃผ์
๋ฐฐ์ด+i == &๋ฐฐ์ด[i]
&๋ฐฐ์ด[i] ๋ ๋ฐฐ์ด[i]๊ฐ์ ์ฃผ์๋ฅผ ๋ปํ๋ฉฐ ๋ฐฐ์ด+i๋ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
๋ฐฐ์ด์ i๋ฒ์ง ๊ฐ
*(๋ฐฐ์ด+i) == ๋ฐฐ์ด[i]
(๋ฐฐ์ด+i) ์ฃผ์์ *๊ฐ ์์ผ๋ฉด ๊ฒฐ๊ตญ ์ฃผ์๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ ๋ปํ๋ฉฐ ์ด๋ ๊ณง ๋ฐฐ์ด[i] ๊ฐ๊ณผ ๊ฐ๋ค.
1์ฐจ์ ํฌ์ธํฐ ์์
#include <stdio.h>
int main(){
int a[3] = {1,2}; // a[0]==1 , a[1]==2 , a[2]==0
int *p = a; // ํฌ์ธํฐ๋ณ์ p๋ a์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํด
printf("%d %d\n" , a[0],a[1],a[2]); // 1 2 0
printf("%d %d\n" , *a,*(a+1),*(a+2)); // 1 2 0
printf("%d %d\n" , *p,*(p+1),*(p+2)); // 1 2 0
printf("%d %d\n" , p[0],p[1],p[2]); // 1 2 0
return 0
}
p๋ a๋ฐฐ์ด์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํค๊ณ ์์์ผ๋ก ์์ ์ถ๋ ฅ๊ฐ์ ๋ชจ๋ 1 2 0 ์ด ๋๋ค.
2์ฐจ์ ๋ฐฐ์ด์ผ๋ ๊ฐ๊ณผ ์ฃผ์๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
a[i][j] --> ๊ฐ
a[i] --> ์ฃผ์ (1์ฐจ์ ํฌ์ธํฐ)
a --> ์ฃผ์ (2์ฐจ์ ํฌ์ธํฐ)
2์ฐจ์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด๋ช
[์์] , *(๋ฐฐ์ด๋ช
+์์)๋ 1์ฐจ์ ํฌ์ธํฐ์ ๋์ผํ๊ณ , 1์ฐจ์ ํฌ์ธํฐ์ ๋ํด์ *๊ณผ []์ ์ด์ฉํด์ผ ๊ฐ์ ๊ฐ๋ฅดํฌ ์๊ฐ ์๋ค.
2์ฐจ์ ๋ฐฐ์ด๊ณผ 1์ฐจ์ ํฌ์ธํฐ ์์
#include <stdio.h>
int main(){
int a[3][2] = {{1,2},{3,4},{5,6}}; // a[0][0]==1, a[0][1]==2, a[1][0]==3, a[1][1]==4, a[2][0]==5, a[2][1]==6,
int *p = a[1]; // ํฌ์ธํฐ๋ณ์ p๋ a[1]์ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํด
printf("%d %d %d\n" , *a[0],*a[1],*a[2]); // 1 3 5
printf("%d %d %d\n" , **a,**(a+1),**(a+2)); // 1 3 5
printf("%d %d\n" , *p,*(p+1)); // 3 4
printf("%d %d\n" , p[0],p[1]); // 3 4
return 0
}
*a[0] *a[1] *a[2] ๋ 1์ฐจ์ ํฌ์ธํฐ๋ก ํด๋น ์ฃผ์๊ฐ๊ณผ ๋์ผํ๋ค.
&a[0][0] == a[0] &a[0][0] == a[0] &a[0][0] == a[0]
**๋ก ์ฃผ์๊ฐ์ ๋๋ฒ ์ฐธ์กฐํ๋ ๊ฒ์ ๊ณง 2์ฐจ์ ํฌ์ธํฐ --> 1์ฐจ์ ํฌ์ธํฐ --> ๊ฐ ์ ๊ฐ๋ฅดํจ๋ค๊ณ ๋ณผ ์ ์๋ค.
p[0] ๊ณผ p[1] ์์ ์ฐธ์กฐ์ ์ํด p == a[1] ์ด๋ฏ๋ก p[0] == a[1][0] p[1] == a[1][1]๋ก ๋ค์ ๋ถ์ฌ์ง๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
2์ฐจ์ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ ๋ฐฐ์ด ์์
#include <stdio.h>
int main(){
int a[3][2] = {{1,2},{3,4},{5,6}}; // a[0][0]==1, a[0][1]==2, a[1][0]==3, a[1][1]==4, a[2][0]==5, a[2][1]==6,
int *p[3] = {a[2],a[0],a[1]}; // ํฌ์ธํฐ ๋ณ์ p๋ฐฐ์ด์ ๊ฐ ๊ฐ์ ๊ฐ๋ฅดํด p[0] == a[2] , p[1] == a[2] , p[2] == a[1]
printf("%d %d %d\n" , a[0][0],a[1][0],a[2][0]); // 1 3 5
printf("%d %d %d\n" , *a[0],*a[1],*a[2]); // 1 3 5
printf("%d %d %d\n" , p[1][0],p[2][0],p[0][0]); // 1 3 5
printf("%d %d %d\n" , *p[1],*p[2],*p[0]); // 1 3 5
return 0
}
p[1][0] p[2][0] p[0][0]์์ p[1] p[2] p[0] ์ ์ญ์ฐธ์กฐ์ ์ํด a[]๊ฐ์ ๊ฐ๋ฅดํด์ผ๋ก
p[1][0] == a[1][0] p[2][0] == a[2][0] p[0][0] == a[0][0] ๊ณผ ๊ฐ๋ค๊ณ ๋ณผ ์ ์๋ค.
2์ฐจ์ ๋ฐฐ์ด๊ณผ 2์ฐจ์ ํฌ์ธํฐ ์์
2์ฐจ์ ๋ฐฐ์ด์ผ ๋ ๋ฐฐ์ด๋ช
[์์][[์์] , *๋ฐฐ์ด๋ช
[์์], **(๋ฐฐ์ด๋ช
+์์)์ผ ๊ฒฝ์ฐ ๊ฐ์ ๊ฐ๋ฅดํจ๋ค.
#include <stdio.h>
int main(){
int a[3][2] = {{1,2},{3,4},{5,6}}; // a[0][0]==1, a[0][1]==2, a[1][0]==3, a[1][1]==4, a[2][0]==5, a[2][1]==6,
int (*p)[2] = a; // p==a , q==a+1 (๋ค์ [2]๋ ์ด์ด 2๊ฐ์ธ ๊ฐ์ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ ๋ณ์๋ผ๋ ๋ป)
int (*q)[2] = a+1;
printf("%d %d %d\n" , a[0][0],a[0][1],a[1][0]); // 1 2 3
printf("%d %d %d\n" , p[0][0],p[0][1],p[1][0]); // 1 2 3
printf("%d %d %d\n" , q[0][0],q[0][1],q[1][0]); // 3 4 5
return 0
}
p์ ๊ฒฝ์ฐ๋ ์ฝ๊ฒ ์ ์ถํ ์ ์์ผ๋ q์ ๊ฒฝ์ฐ๋ ์กฐ๊ธ ๋ณต์กํ๊ฒ ๋๊ปด์ง ์๊ฐ ์๋ค.
์ฝ๊ฒ ํ์ดํ์๋ฉด q == a+1๋ก a[1]์ ๊ฐ์ธ 3์ ๊ฐ๋ฅดํจ๋ค. ์ด๋ q๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ธ a[1] ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก a[1]๋ฒ์งธ ๋ฉ๋ชจ๋ฆฌ ๋ถํฐ [0][0] ๊ทธ ๋ค์์ [0][1] ๋ค์์ [1][0]... ์ ์์๋ก ๊ฐ๋ฅดํจ๋ค๊ณ ๋ณผ ์๊ฐ ์๋ค.
๊ตฌ์กฐ์ฒด๋ ํฌ์ธํฐ๋ก ์ ๊ทผํ ์ -> ๋ก ์ ๊ทผํ๊ฒ ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ์ฒด ๋ณ์๋ก ์ ๊ทผํ ๋์ . ๊ณผ ๋์ผํ ์๋ฏธ๋ผ๊ณ ์ดํดํ๋ฉด ์ฝ๋ค.
๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ์์
#include <stdio.h>
// ๊ตฌ์กฐ์ฒด ์ ์
struct Person {
char name;
int age;
};
int main() {
struct Person ptr = {'jack',25};
struct Person *p = &ptr;
// ํฌ์ธํฐ๋ฅผ ํตํด ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ๊ฐ ์ถ๋ ฅ
printf("%c %d\n", ptr.name, ptr.age); // jack 25
printf("%c %d\n", (&ptr)->name, (&ptr)->age); // jack 25
printf("%c %d\n", p->name, p->age); // jack 25
printf("%c %d\n", p[0].name, p[0].age,); // jack 25
return 0;
}
1์ฐจ์ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด๊ณผ 1์ฐจ์ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ์์
#include <stdio.h>
// ๊ตฌ์กฐ์ฒด ์ ์
struct Person {
char name;
int age;
};
int main() {
struct Person ptr[3] = {'jane',21, 'jack',20, 'sam',24}; // 'jane',21==s[0] , 'jack',20==s[1] , 'sam',24==s[2]
struct Person *p = ptr;
// ํฌ์ธํฐ๋ฅผ ํตํด ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ๊ฐ ์ถ๋ ฅ
printf("%c %d\n", ptr[0].name, ptr[0].age); // jane 21
printf("%c %d\n", (*s).name, (*s).age); // jane 21
printf("%c %d\n", s->name, s->age); // jane 21
printf("%c %d\n", (s+1)->name, (s+1)->age); // jack 20
printf("%c %d\n", p[0].name, p[0].age); // jane 21
printf("%c %d\n", (*p).name, (*p).age); // jane 21
printf("%c %d\n", p->name, p->age); // jane 21
printf("%c %d\n", (p+1)->name, (p+1)->age); // jack 20
return 0;
}
ํฌ์ธํฐ๋ก ์ ๊ทผํ ์ -> ๋ก ์ ๊ทผํ๊ฒ ๋๋ค์ ๊ฐ๋ ๋ง ์ดํดํ๊ณ ์๋ค๋ฉด ์์ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ ๊ฐ๋ ๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋ณต์กํ๊ฒ ์ ๊ทผํ ํ์๊ฐ ์๋ค.
ํจ์ ํฌ์ธํฐ๋ ํจ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ณ , ํด๋น ์ฃผ์์ ํจ์๋ฅผ ํธ์ถํ๋๋ฐ ์ฌ์ฉํ๋ ํฌ์ธํฐ์ด๋ค.
๋ฆฌํดํ์
(*ํจ์_ํฌ์ธํฐ)(ํจ์ ํ๋ผ๋ฏธํฐ);
ํจ์ ํฌ์ธํฐ ์์
#include <stdio.h>
void fn1(){
print("fn1 ํจ์\n");
}
int fn2(int a){
print("fn2 ํจ์:\n", a);
retirn 0;
}
int main(){
void (*pf1)(); // ํ๋ผ๋ฏธํฐ๋ ๋ฐ์ง ์๊ณ voidํ์
์ ๋ฆฌํด
int (*pf2)(int); // ํ๋ผ๋ฏธํฐ๋ก int๊ฐ์ ๋ฐ๊ณ intํ์
์ ๋ฆฌํด
fn1(); // fn1 ํจ์
fn2(5); // fn2 ํจ์: 5
pf1 = fn1;
pf2 = fn2;
pf1(); // fn1 ํจ์
pf2(2); // fn2 ํจ์: 2
return 0;
}