카테고리 없음

C언어 강좌(공부) #20~부록Tip

바래다주기 2024. 5. 7. 04:15

20장

함수 포인터 : 1. 특정 함수를 구성하는 시작 명령의 위치를 가리키는 포인터
                      2. 함수 포인터를 사용하여 함수를 호출하여 실행 가능

 

함수의 주소 값으로 함수 실행하기

  1. 함수 포인터는 함수 원형(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을 사용

공용체의 요소들은 할당된 메모리를 공유한다

  1. 공용체로 만든 자료형의 크기는 요소 중 가장 큰 요소의 크기와 동일
  2. 공용체의 요소들은 서로 같은 메모리를 공유
  3. 공용체를 이용하면 캐스팅을 사용하지 않고 일부 메모리의 값을 쉽게 가져올 수 있음

공용체는 메모리 절약의 끝판왕

  1. 공용체는 주로 메모리 절약하는 용도로 사용됨

구조체 문법으로 비트 단위 분리하기

  1. 구조체 문법에서 비트 단위로 데이터를 사용하는 기능을 제공

구조체 비트 분리 문법을 사용한 변수와 일반 변수는 값 교환이 힘듦

  1. 구조체에 비트 분리 문법을 사용한 경우 요소와 . (요소 지정) 연산자를 함께 사용해야지만 대입 가능

공용체를 사용해서 좀 더 편하게 비트 단위 분리하기

  1. 공용체를 사용하면 메모리를 복사하지 않고 일반 변수에 값 복사 가능

#define 과 typedef를 헷살리지말자
전처리기 #define 과 typedef 문법
#define은 컴파일러에게 이런 용어로 바꿔달라고하는 부분이고
typedef은 사용자가 새롭게 정의해서 사용하는 문법

  1. 전처리기인 #define과 사용자 정의 자료형을 만드는 typedef문법은 A 를 B로 치환

typedef 문법으로 상수 치환은 불가능하다

열거형(enum) : 상수를 좀더 효과적으로 치환하는 방법

  1. 상수를 연속적으로 치환하는 경우 열거형(enum) 상수를 사용

조건부 컴파일 : 자기가 만든 코드를 테스트하는 것이 프로그래머의 기본이다
소스 코드에 테스트 코드 사용

전처리기를 사용해서 조건에 따라 필요한 문장만 골라 컴파일하기

  1. C언어는 주어진 조건에 따라 컴파일 할 수 있도록 다양한 전처리기를 제공함
  2. #ifdef, endif, #ifndef 등의 전처리기

#ifdef 전처리기와 #endif 전처리기
테스트용으로 많이쓰임 #define My ~~ 이런식으로 정의를해주면 거기에있는 #ifdef를 읽어주는것이고
반대로 없으면 읽지않고 지나감 그러므로 테스트용으로 많이쓰임

#ifdef와 반대인 #ifndef 전처리기

  1. #ifndef 전처리기 : if not define 을 의미하여 #ifdef 와 반대 의미

헤더 파일 중복 참조를 막는 방법

  1. 조건부 컴파일 전처리기들은 실무에서 헤더 파일을 선언할 때 주로 사용

헤더 파일 중복 참조 오류는 조건부 컴파일을 사용하면 해결 가능

  1. #include 의 중복 사용은 #ifndef ~ #endif 를 사용하여 해결 가능
    ex) #ifndef _TEST_H_ // _TEST_H_ 가 정의되어 있지 않다면 아래 코드 컴파일 함
    #define_TEST_H_ // _TEST_H_ 를 정의함
  2. #endif

포인터와 증감 연산자를 잘 써야 명령문이 간단해진다
*p++ 와 *++p 의 의미

  1. *p++ : 자신이 가리키는 주소에 저장된 값을 사용한 후 자신의 주소를 증가
  2. *++p : 자신의 주소를 증가시킨 후에 그 주소에 가서 값을 사용