나도 이걸 하고는 있는데….

계속보고있어야 이해되고…

차차착 하고 파팍!!! 하고 이해돼야하는거아닌가

그래도 공부는 계속된다


malloc / calloc / realloc

int count = 10;

// malloc은 저장공간을 초기화시켜주지 않음
int* pa = (int*)malloc(sizeof(int) * count);
// calloc은 동적메모리를 할당하고 0으로 초기화
pa = (int*)calloc(count, sizeof(int);
// realloc은 기존에 할당된 공간 재할당 할 때 사용
// 기존에 가지고 있던 값을 복사해 새로운 메모리에 할당. 이전 메모리 제거
pa = realloc(pa, sizeof(int) * count);

C가 OS에서 메모리 달라고 요청해서 주면 쓰고 그걸 다시 반납해야한다대….

반납안하면 메모리에 값이 남거나, 메모리 공간이 부족해져서 효율이 떨어진다고 한다.

(자료형*)malloc(할당받을 메모리 크기); // 요청
free(변수명) // 반납

할당받을 메모리 크기가 들어갈 자리에는 num type만 들어감

free는 되도록 malloc을 쓴 자리에서 해주는게 좋다


문자열

char str[] = "Monster";
char str2[] = { 'M', 'o', 'n', 's', 't', 'e', 'r' };  // 문자 배열.
//임의로 \0을 넣으면 문자열이 됨
char str3[10] = { 'M', 'o', 'n', 's', 't', 'e', 'r', '\0' };

문자열은 끝나는 부분이 끝났다는 걸 알려주려고 0을 붙인다고 한다

그래서 0을 찾을때까지 함수를 수행하라는 명령으로 문자열의 끝을 알수있다

// 문자열의 문자 갯수를 세는 함수
strlen(문자열);

// 문자열 카피
strcpy(문자열을 넣을 공간, 문자열)

// 문자열 비교
strcmp(문자열, 문자열)
// 비교 예시
int comparevalue = strcmp(str, str2);
if (comparevalue == 0) {
	printf("str:%s 와 str3: %s 의 두 문자열이 같습니다.\n", str, str2);
}
else {
	printf("str:%s 와 str3: %s 의 두 문자열이 다릅니다..\n", str, str2);
}

// 문자열 병합
strcat(문자열, 문자열)


함수의 주소값 저장

// 리턴값은 int형이고 매개변수는 int값 두개를 받는 함수의 주소값을 저장하는 변수
int(*pfunc)(int, int);
pfunc = 함수이름;
// pfunc = &함수이름; 이라는뜻

// pfunc변수로 함수를 호출
int ret = pfunc(a, b);

함수를 변수에 할당하려면 저렇게 써 줘야 한다.

변수명을 감싸는 괄호가 무슨 의미인지 당최 이해할 수는 없지만…

자연스럽게 받아들여야하는거겠지요…?

그러니까 … 함수 주소를 받는 녀석한테 함수를 전달하고 그 함수를 어디 변수에 넣어서 쓰게한다는건데…

변수 내부의 값만 변경? 하는거라서 그 주소 그대로 쓰겠다는 취지인건지…

읽을수는 있는데 내가 하라고 하면 좀 어려울거같다


예시 1
// 플로트형을 먹고 플로트를 뱉는 함수, int a, int b를 매개변수로 받는 함수
float calculator(float(*pfunc)(float, float), int a, int b) {
	return pfunc(a, b);
}
예시 2
// 함수포인터 배열에 함수 저장도 된다
void(*pfuncArray[4])(int, int);

pfuncArray[0] = AddPrint;
pfuncArray[1] = SubPrint;
pfuncArray[2] = MulPrint;
pfuncArray[3] = DivPrint;

그리고 C는 자바스크립트랑 다르게 호이스팅을 못시켜줘서 위에서 꼭 선언해줘야함…

함수 통으로 위에 죽 늘여놓기 좀 그러니까 아예 선언 시켜주고 밑에서 이게뭐하는건지 알려주는거인듯

include로 라이브러리뿐만 아니라 내 파일도 가져올 수 있는데, 굳이 경로를 다 쓰지 않아도 슥 가져오는게 신기하다