C언어 강좌(공부) #20~부록Tip
20장
함수 포인터 : 1. 특정 함수를 구성하는 시작 명령의 위치를 가리키는 포인터
2. 함수 포인터를 사용하여 함수를 호출하여 실행 가능
함수의 주소 값으로 함수 실행하기
- 함수 포인터는 함수 원형(Function Prototype)을 사용해서 포인터를 선언
함수 포인터 선언 및 함수의 주소 대입
int (*p) (int, int) // Sum 함수를 가리킬 수 있는 함수 포인터 선언
p = &Sum // Sum 함수의 주소를 p에 저장
함수 포인터로 함수 호출
int result = (*p)(2,3) // int result = Sum(2,3); 과 동일
typedef int (*FP_OP)(int,int)
FP_OP fp = ∑ // int (*fp)(int, int) typedef를 이용하면 함수 포인터를 좀더 쉽게 표현 가능해진다
FP_OP fp[4];
콜백 함수
라이브러리를 만드는 라이브러리 프로그래머
부록 Tip
구조체 struct를 사용
공용체는 union을 사용
공용체의 요소들은 할당된 메모리를 공유한다
- 공용체로 만든 자료형의 크기는 요소 중 가장 큰 요소의 크기와 동일
- 공용체의 요소들은 서로 같은 메모리를 공유
- 공용체를 이용하면 캐스팅을 사용하지 않고 일부 메모리의 값을 쉽게 가져올 수 있음
공용체는 메모리 절약의 끝판왕
- 공용체는 주로 메모리 절약하는 용도로 사용됨
구조체 문법으로 비트 단위 분리하기
- 구조체 문법에서 비트 단위로 데이터를 사용하는 기능을 제공
구조체 비트 분리 문법을 사용한 변수와 일반 변수는 값 교환이 힘듦
- 구조체에 비트 분리 문법을 사용한 경우 요소와 . (요소 지정) 연산자를 함께 사용해야지만 대입 가능
공용체를 사용해서 좀 더 편하게 비트 단위 분리하기
- 공용체를 사용하면 메모리를 복사하지 않고 일반 변수에 값 복사 가능
#define 과 typedef를 헷살리지말자
전처리기 #define 과 typedef 문법
#define은 컴파일러에게 이런 용어로 바꿔달라고하는 부분이고
typedef은 사용자가 새롭게 정의해서 사용하는 문법
- 전처리기인 #define과 사용자 정의 자료형을 만드는 typedef문법은 A 를 B로 치환
typedef 문법으로 상수 치환은 불가능하다
열거형(enum) : 상수를 좀더 효과적으로 치환하는 방법
- 상수를 연속적으로 치환하는 경우 열거형(enum) 상수를 사용
조건부 컴파일 : 자기가 만든 코드를 테스트하는 것이 프로그래머의 기본이다
소스 코드에 테스트 코드 사용
전처리기를 사용해서 조건에 따라 필요한 문장만 골라 컴파일하기
- C언어는 주어진 조건에 따라 컴파일 할 수 있도록 다양한 전처리기를 제공함
- #ifdef, endif, #ifndef 등의 전처리기
#ifdef 전처리기와 #endif 전처리기
테스트용으로 많이쓰임 #define My ~~ 이런식으로 정의를해주면 거기에있는 #ifdef를 읽어주는것이고
반대로 없으면 읽지않고 지나감 그러므로 테스트용으로 많이쓰임
#ifdef와 반대인 #ifndef 전처리기
- #ifndef 전처리기 : if not define 을 의미하여 #ifdef 와 반대 의미
헤더 파일 중복 참조를 막는 방법
- 조건부 컴파일 전처리기들은 실무에서 헤더 파일을 선언할 때 주로 사용
헤더 파일 중복 참조 오류는 조건부 컴파일을 사용하면 해결 가능
- #include 의 중복 사용은 #ifndef ~ #endif 를 사용하여 해결 가능
ex) #ifndef _TEST_H_ // _TEST_H_ 가 정의되어 있지 않다면 아래 코드 컴파일 함
#define_TEST_H_ // _TEST_H_ 를 정의함 - #endif
포인터와 증감 연산자를 잘 써야 명령문이 간단해진다
*p++ 와 *++p 의 의미
- *p++ : 자신이 가리키는 주소에 저장된 값을 사용한 후 자신의 주소를 증가
- *++p : 자신의 주소를 증가시킨 후에 그 주소에 가서 값을 사용