๐Ÿ’พC์–ธ์–ด ํฌ์ธํ„ฐ ๊ฐœ๋…

lyju777ยท2024๋…„ 4์›” 9์ผ

ํฌ์ธํ„ฐ(Pointer)๋ž€?

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)์—์„œ *๋Š” ์ฃผ์†Œ๊ฐ’์— ํ•ด๋‹น๋˜๋Š” ๊ฐ’์„ ์˜๋ฏธํ•˜๊ณ  &๋Š” ์ฃผ์†Œ๊ฐ’์„ ์˜๋ฏธํ•จ์œผ๋กœ * ์™€ &๋Š” ์„œ๋กœ ์ƒ๋ฐ˜๋จ์œผ๋กœ ์ƒ์‡„๋œ๋‹ค.
์ƒ๋ฐ˜๋˜๋Š” ๊ฒƒ์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์•„ ํšจ๊ณผ๊ฐ€ ์—†์–ด์ง„๋‹ค๋Š” ์˜๋ฏธ


1์ฐจ์› ๋ฐฐ์—ด ํฌ์ธํ„ฐ

๋ฐฐ์—ด์˜ 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์ฐจ์› ๋ฐฐ์—ด๊ณผ 1์ฐจ์› ํฌ์ธํ„ฐ

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;
 }
profile

0๊ฐœ์˜ ๋Œ“๊ธ€