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)(int, int) = 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(3, 1, 2, 3); 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 |