728x90
공용체 union 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
union smart
{
    int A;    short B;
    int C;    char D;
}obj;
 
int main()
{    
    obj.A = 0x12345678;    obj.B = 0x12345678;
    obj.C = 0x12345678;    obj.D = 0x12345678;
        
    printf("Size of Smart: %d\n"sizeof(union smart));
    printf("%x\n", obj.A);    printf("%x\n", obj.B);
    printf("%x\n", obj.C);    printf("%x\n", obj.D);
    return 0;
}
cs


위 공용체의 size는 4byte


Little Endian

78 

 56

 34

 12


obj.A=12345678   // int A

obj.B=5678        // short B

obj.C=12345678  // int C

obj.D=78           // char D



함수 포인터


: 함수를 가리키는 포인터 


int SoSimple(int num1, int num2) { ....}


위 함수에 대한 함수 포인터 변수 선언

int (*fptr) (int, int);



함수 포인터 변수에 SoSimple 주소값 저장

fptr = SoSimple



이는 fptr(3, 4);    // SoSimple(3, 4)와 동일한 결과


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void Add(int n1, int n2)
{
    printf("%d + %d = %d \n", n1, n2, n1 + n2);
}
 
int main()
{    
    int num1 = 10, num2 = 20;
 
    void(*fptr)(intint= Add;
    fptr(num1, num2);
    return 0;
}
cs

Output :

10 + 20 = 30



void형 포인터 변수는 어떠한 변수의 주소 값이든 담을 수 있지만(함수의 주소값도)

값의 변경이나 참조를 비롯한 어떤 포인터 연산도 불가

: type 정보가 없기 때문에 당연


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
void voidFunc(void)
{
    printf("void ptr test\n");
}
 
int main()
{
    void(*fptr)(void= voidFunc;
    fptr();
    return 0;
}
cs

Output :

void ptr test


함수 포인터 사용 이유 (참고 : http://norux.me/8)  


①프로그램 코드의 간결

②중복 코드를 줄이기 위해서

③상황에 따라 해당되는 함수를 호출할 수 있음


그외에 참고 https://kldp.org/node/133026




가변 인자 함수


num = Sum(3, 1, 2, 3);    // 3은 이후에 전달되는 인자의 갯수 (1,2,3)


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int Sum(int n, ...)    // 가변 인자에 대한 선언
{
    printf("n=%d \n", n);    
    return 0;
}
 
int main()
{    
    Sum(3123);
    return 0;
}
cs

Output :

n=3


가변 인자 함수의 호출을 통해 전달되는 인자 정보 추출


#include <stdarg.h>

1. 가변인자를 가리킬 수 있는 참조자 선언     : va_list

2. 참조자가 가변인자를 실제 참조                : va_start

3. 참조자를 통해 전달된 정보 추출               : va_arg

4. 참조자가 가변인자를 가리키지 않도록 해제 : va_end


Output :

3+5=2=10



22행 : (vlist, int) 첫번째 인자는 참조자 이름, 두번째 인자는 참조대상의 type



'Study > C' 카테고리의 다른 글

enum, auto, 구조체  (0) 2017.03.24
C 복습-콘솔 입출력  (0) 2017.02.11
파일의 분할과 헤더파일의 디자인  (0) 2016.08.30
선행처리기와 매크로2  (0) 2016.08.30
선행처리기와 매크로  (0) 2016.08.29

+ Recent posts