임베디드를 배우기 전 간략한 C 이론 5
함수포인터를 만들 때 괄호를 추가하는것을 잊지말자.
int (*pf)(double, int);
1 | int temp = 5; |
Data 영역 - 전역, static
Heap영역 - 동적할당영역
Stack영역- 지역변수, 매개변수
정적할당(배열) - 컴파일 타임에 할당, 접근속도가 빠르다. 코드 유지보수성 낮다(데이터 추가, 삭제)
동적할당 - run time(실행타임), 접근속도가 느리다.코드유지보수성이 높다.(데이터 추가 삭제 쉽다.), 메모리 낭비 x, 메모리 자동 해제(x) ->직접해제할것
void *malloc(size_t size);
여기서 size_t는 typedef unsigned int size_t 로 보면된다.
헤더는 stdlib.h을 불러오면 된다.
void * pNew = malloc(40); 이 있다고 했을 때 pNew는 힙영역에 할당되는 변수가 아니다.
((int))pNew) = 5; //좋지 않은코드
((int)pNew+1) = 7; //좋지 않은코드
int *pt = (*int)pNew;
*pt = 5; 또는 pt[0]=5//권장
*(pt+1) = 7; 또는 pt[1]=7 //권장
int * pNew = (int*)malloc(40);
구조체
1 | struct person{ |
위와 같이 쓸수도 있지만
1 | typedef struct { |
보통 이렇게 쓴다.
그럼 다음과같이 선언이 가능하다,.
PER p1;
p1.name =”kim”; //안된다. 문자열 상수이므로. 이해가 안될경우 잘생각해보자.
구조체 멤버변수는 디폴트로 public
구조체에서 “.” 은 구조체 멤버 직접접근연산자
1 | -> 간접접근연산자 |
구조체는 멤버변수간 패딩바이트를 둬서 구조체의 사이즈를 측정하면 더 크게 나올 수 있다.
구조체 + 포인터변수
- 구조체 변수를 참조하는 포인터
- 포인터 변수를 구조체 멤버변수로 포함
(*ptr).age == ptr->age
PER arr[3]; //구조체 배열