프로그래밍 언어/C언어

포인터 활용하기

원원 2021. 8. 7. 10:43

안녕하세요. 오늘은 포인터의 활용에 대해 알아보겠습니다.

 

1. 데이터 변환

*포인터 미사용

int형(32비트) 변수에 어떤 값이 있고 이 값을 8비트씩(char형) 쪼개서 저장하는 코드입니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main()
{
    int i_A=0b00000100000000110000001000000001;//32비트,00000100 00000011 00000010 00000001
    char c_B[4];//8비트
    
    c_B[0= (i_A>>0& 0b11111111;
    c_B[1= (i_A>>8& 0b11111111;
    c_B[2= (i_A>>16& 0b11111111;
    c_B[3= (i_A>>24& 0b11111111;
    
    printf("c_B[0] : %d \n",c_B[0]);
    printf("c_B[1] : %d \n",c_B[1]);
    printf("c_B[2] : %d \n",c_B[2]);
    printf("c_B[3] : %d \n",c_B[3]);
}
cs

출력값

- 2진수 표현을 위해 0b를 사용했습니다.

- 쉬프트 연산을 이용해서 8비트씩 좌측으로 옮겼고, &연산을 통해서 1인 값을 추출했습니다.

 

*포인터 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int i_A=0b00000100000000110000001000000001;//32비트,00000100 00000011 00000010 00000001
    char *p_C = (char *)&i_A;
    
    
    printf("p_C[0] : %d \n",p_C[0]);
    printf("p_C[1] : %d \n",p_C[1]);
    printf("p_C[2] : %d \n",p_C[2]);
    printf("p_C[3] : %d \n",p_C[3]);
}
cs

- 데이터 타입을 맞춰주기 위해 (char *)을 사용했습니다

- p_C는 포인터이므로 배열 같은 느낌이 있습니다

 

2.데이터 직렬화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
 
typedef struct
{
    int i;
    char c;
}packet;
 
 
int main()
{
    packet p;
    int i;
    char buf[1024];
    char *c;
    
    p.i = 1;
    p.c = 2;
    
    c = (char *)&p;
    printf("%d \n",sizeof(packet));
    for(i = 0; i<sizeof(packet);i++)
    {
        buf[i]=c[i];
        printf("i:%d   buf[%d]:%d   c[%d]:%d\n",i, i, buf[i],i,c[i]);
    }
}
cs

 

 

3. 파라메터 전달

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
 
typedef struct
{
    int a[1000];
}st;
 
st s2;
 
void f1(st s)
{    
}
void f2(st *s)
{
}
void call1()
{
    st s1; //스택사이즈 증가 
    f1(s1);
}
void call2()
{
    f2(&s2);
}
int main()
{
    call1(); // 스택사이즈가 데이터타입 st크기만큼 커짐  
    call2(); // 스택사이즈가 커지지않음     
}
cs

 

4. 함수포인터

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int callBack(int a)
{
    return a;
}
 
int (*p_func)(int);
 
int main()
{
    p_func = callBack;
    printf("%d \n",(*p_func)(1) ); //호출방법1 
    printf("%d \n",p_func(2) ); //호출방법2 
}
cs

사용 예시: 어떤 이벤트 발생 시점에 함수포인터 변수로 함수 호출을 가변적으로 할 때 사용함

 

 

참고: https://www.youtube.com/watch?v=xIGSE7tvQ9Q