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)
exit(반환값) : 프로세스 종료
Shell 스크립트에서 $? 로 종료코드를 확인할 수 있다.
포인터 변수의 시작 주소를 다른 포인터 변수의 데이터로 이용할 수 있는데 이를 다중 포인터라고 한다.
선언 예시
자료형 **변수명;
포인터 변수가 함수의 시작주소를 저장하여 포인터를 참조하여 함수를 호출할 수 있다.
선언 예시
자료형 (* 변수명)(매개변수리스트); 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]; // 배열도 선언 가능하다.
형 변환 연산자를 사용하여 변환할 수 있다.
사용 예시
(자료형*)포인터
어느 것이든 가리킬 수 있는 포인터이다. (참조할 대상체가 정해져 있지 않은 포인터)
void *ptr;
Generic programming - 자료형을 일반화 하는것, 자료형에 대한 제약없이 사용가능한 함수를 제네릭 함수라 부른다.
호출될 함수를 알려 주어 다른 프로그램 또는 다른 모듈에서 함수를 호출하게 하는 함수를 콜백함수라고 한다.
즉, 외부 라이브러리에서 현재 실행중인 함수를 호출하는 것이다.
이때 라이브러리가 현재 실행중인 함수를 호출하려면 함수의 주소를 알아야하는데, 라이브러리 호출시 함수의 주소를 넘겨주어 함수를 호출하게 할 수 있으며, 라이브러리가 호출하는 함수를 콜백함수라 한다.
콜백함수 예시
qsort( 배열, 갯수, 원소크기, 비교함수);
가변인자란 함수 인자의 수가 정해져 있지 않은 함수를 말한다.(ex) printf(), scanf())
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 포인터로 저장한다.
define BUF_SZ 5
int Arr[BUF_SZ];
funcA(Arr); // 함수호출
funcA(int Arr[])
{
printf("%d\n",sizeof(Arr)/sizeof(Arr[0]));
}
이때 함수인자는 포인터로 들어온다. 따라서 원하는 결과가 나오지 않는다.
크기를 신경써야한다.
ex) int x1[2][5], x2[2][4]
int (*p)[5];
=> x1만 호환가능하다.
ex) for(i=0;i<strlen(str);i++) x
ex)
char *p = "hello";
char c[] = "hello";
p[0] = 'H'; => 출력할 때 런타임에러
const 선언시 컴파일에러
c[0] = 'H'; => 항상성공
(컴파일러에 따라 다르다)
c 언어에는 여러 자료형이 복합된 데이터를 효율적으로 처리할 수 있게 해주는 구조체와 공용체가 있다.
구조체란 멤버라고 하는 값들의 모임이며, 구조체의 멤버들은 대부분 서로 다른 타입으로 구성될 수 있는 통합 자료형이다.
※ 구조체의 멤버 사이 빈공간에 패딩비트가 들어가기 때문에, 항상 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