임베디드를 배우기 전 간략한 C 이론 6

임베디드를 배우기 전 간략한 C 이론 5

함수포인터를 만들 때 괄호를 추가하는것을 잊지말자.
int (*pf)(double, int);

1
2
3
int temp = 5;
void* ptr = &temp; // void 형 포인터: 어떤 변수의 주소값도 저장이 가능한 변수
((int*)ptr) = 7;

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
2
3
4
struct person{
int name[30];
int age;
};

위와 같이 쓸수도 있지만

1
2
3
4
5
typedef struct {
int name[30];
int age;

}PER;

보통 이렇게 쓴다.
그럼 다음과같이 선언이 가능하다,.
PER p1;

p1.name =”kim”; //안된다. 문자열 상수이므로. 이해가 안될경우 잘생각해보자.

구조체 멤버변수는 디폴트로 public

구조체에서 “.” 은 구조체 멤버 직접접근연산자

1
2
-> 간접접근연산자
. 직접접근연산자

구조체는 멤버변수간 패딩바이트를 둬서 구조체의 사이즈를 측정하면 더 크게 나올 수 있다.

구조체 + 포인터변수

  1. 구조체 변수를 참조하는 포인터
  2. 포인터 변수를 구조체 멤버변수로 포함

(*ptr).age == ptr->age

PER arr[3]; //구조체 배열

Share