Adbanced C 강의 3일차

이승현·2021년 6월 30일
0

Advanced C 강의

목록 보기
3/5

-2강

1. main() 함수의 매개변수

main 함수는 argc와 argv[]의 인수를 갖는다.

인수를 전달하기 위한 main()함수 선언

int main( int argc, char *argv[] )
int main( int argc, char **argv )

사용예시

a.out samlple 1000 a.txt
=> argc : 4, argv[4] = {&a.out[0],&sample[0], &1000[0], &a.txt[0]} (문자열의 주소가 입력되어 있다, 문자열 x)
  • 인자는 문자열 형식으로 입력된다 => 따라서 다른 자료형으로 사용시 변환이 필요하다.
    문자열 - int : atoi() , - float : atof() (stdlib.h)

exit(반환값) : 프로세스 종료
Shell 스크립트에서 $? 로 종료코드를 확인할 수 있다.

2. 다중 포인터

포인터 변수의 시작 주소를 다른 포인터 변수의 데이터로 이용할 수 있는데 이를 다중 포인터라고 한다.

선언 예시

자료형 **변수명;
  • 다중 포인터의 다음주소도 각 포인터의 주소에 매칭된다.

3. 함수 포인터

포인터 변수가 함수의 시작주소를 저장하여 포인터를 참조하여 함수를 호출할 수 있다.

선언 예시

자료형 (* 변수명)(매개변수리스트);
int (* funcP)(char *);

사용예시

funcP = 함수이름;
(*funcP)(함수인자);
funcP(함수인자);

함수 포인터 배열

함수 포인터 자료형이 여러 개 모여 있는 것이다.(점프 테이블 이라고도 한다.)

선언 예시

int (*ptrArr[4])(int,int)={add,sub,mul,div};

이중 함수 포인터 배열

선언 예시

int (**ptr)(int,int);

사용 예시

int (*ptrArr[4])(int x,int y)={add,sub,mul,div};
int(**ptr)(int,int);
ptr = ptrArr;
result=(**(ptr+(menu_no-1)))(num1,num2);

함수 포인터 자료형 선언

함수 포인터 자료형을 자주 사용할 때 쓴다.

선언 예시

typedef 반환자료형 (*함수포인터별명)(매개변수리스트);
typedef int (*FP)(int,int);

사용 예시

FP fp1, fp2;
FP fp[4]; // 배열도 선언 가능하다.

4. 포인터 형 변환

형 변환 연산자를 사용하여 변환할 수 있다.

사용 예시

(자료형*)포인터

void 형 포인터

어느 것이든 가리킬 수 있는 포인터이다. (참조할 대상체가 정해져 있지 않은 포인터)

void *ptr;

  • 함수의 인자로 다양한 자료형 포인터가 들어올 때 많이 사용한다.(ex) short int, int, double ..)

Generic programming - 자료형을 일반화 하는것, 자료형에 대한 제약없이 사용가능한 함수를 제네릭 함수라 부른다.

5. 콜백(CallBack)함수

  • 호출될 함수를 알려 주어 다른 프로그램 또는 다른 모듈에서 함수를 호출하게 하는 함수를 콜백함수라고 한다.

  • 즉, 외부 라이브러리에서 현재 실행중인 함수를 호출하는 것이다.

  • 이때 라이브러리가 현재 실행중인 함수를 호출하려면 함수의 주소를 알아야하는데, 라이브러리 호출시 함수의 주소를 넘겨주어 함수를 호출하게 할 수 있으며, 라이브러리가 호출하는 함수를 콜백함수라 한다.

콜백함수 예시

qsort( 배열, 갯수, 원소크기, 비교함수);

6. 가변인자

가변인자란 함수 인자의 수가 정해져 있지 않은 함수를 말한다.(ex) printf(), scanf())

  • ANSI C 에서는 이식성을 높일 목적으로 <stdarg.h>라는 헤더파일에 가변길이 인수를 사용하기 위한 매크로를 제공하고 있다. va_start, va_arg, va_end 이다.

va_start : void va_start(va_list list, last);
- list 초기화 : 가변인자의 첫 번째 시작주소를 저장한다.

va_arg : type va_arg(va_list list, type);
- 가변인자 리스트를 하나씩 접근하기 위해 사용된다.

va_end : void va_end(va_list list);
- list를 NULL 포인터로 저장한다.

7. 주의사항

1) 배열의 크기

define BUF_SZ 5
int Arr[BUF_SZ];
funcA(Arr); // 함수호출

funcA(int Arr[])
{
	printf("%d\n",sizeof(Arr)/sizeof(Arr[0]));
}

이때 함수인자는 포인터로 들어온다. 따라서 원하는 결과가 나오지 않는다.

2) 배열 포인터와 배열의 호환

크기를 신경써야한다.
ex) int x1[2][5], x2[2][4]
int (*p)[5];
=> x1만 호환가능하다.

3) 반복제어문에 함수호출 x

ex) for(i=0;i<strlen(str);i++) x

4) 문자열 상수를 가리키는 포인터는 const로 선언해라

ex)

char *p = "hello";
char c[] = "hello";
p[0] = 'H'; => 출력할 때 런타임에러
const 선언시 컴파일에러
c[0] = 'H'; => 항상성공

(컴파일러에 따라 다르다)

3강-

1. 구조체

c 언어에는 여러 자료형이 복합된 데이터를 효율적으로 처리할 수 있게 해주는 구조체와 공용체가 있다.

구조체

구조체란 멤버라고 하는 값들의 모임이며, 구조체의 멤버들은 대부분 서로 다른 타입으로 구성될 수 있는 통합 자료형이다.

  • 구조체 변수는 멤버들이 메모리에 차례대로 할당된다. 초기화된 구조체변수emp 변수의 메모리 할당구조이다.

※ 구조체의 멤버 사이 빈공간에 패딩비트가 들어가기 때문에, 항상 sizeof()로 체크해 봐야 한다
메모리는 항상 4또는 8로 할당한다.(32bit - 4 64bit -8)
(#pragma pack(1) 이라는 좋은 기능이 있다. 빈공간을 없앤다. 속도가 느려지기 때문에 잘 안쓴다.)

참조
#pragma pack(push,1) : 현재 설정을 push 해서 백업한 뒤 정렬방식 1로 설정
#pragma pack(pop) : 원래설정 복구

구조체의 선언과 정의

선언과 정의 예시

struct Employee { char name[20];
		char phone[15];
        	int age;	} emp1, emp2; => 정의

typedef 사용

typedef struct Employee { char name[20];
		char phone[15];
        	int age;	} emp1; => 새로운 자료형 명

구조체 포인터

구조체 포인터란 포인터를 통하여 구조체 변수에 접근하는 개념이다. 구조체 포인터 변수도 일반 포인터 변수와 마찬가지로 변수명 앞에 '*'를 붙여 선언한다.

-> : 구조체 포인터 연산자
구조체 포인터 변수를 사용하여 멤버에 접근하기 위해 또 다른 연산자를 제공한다.

ex) ptr->age , ptr->name

profile
노른노른

0개의 댓글

관련 채용 정보