지금 보니까 좀 속은 것 같다. js는 타입이 달라도 배열로 만들 수 있는걸..?
// struct
struct person {
char name[10];
int age;
float height;
char address[80];
};
struct person a; // 구조체 변수 선언
// typedef
typedef struct _person {
char name[10];
int age;
float height;
char address[80];
} person;
person a;
person b;
a = b; // 대입은 가능!
a > b; // 비교는 불가능!
구조체의 필드(변수) 중에서 자기 자신을 가리키는 포인터가 존재하는 구조체.
연결리스트 구현에 많이 이용한다!!
typedef struct _ListNode { char data[10]; struct _ListNode *link; // 포인터는 뭔데? } ListNode;
다른 변수의 주소를 가지고 있는 변수!!!
char a = 'A';
char *p;
p = &a; // & : 변수의 주소
*p = 'B'; // * : 가르키는 곳의 내용
p // 포인터의 값 (주소)
*p // 포인터가 가리키는 값
*p++ *(p++) // 포인터가 가리키는 값을 가져온 후, 포인터(주소)가 한칸 증가.
*p-- *(p--) // 포인터가 가리키는 값을 가져온 후, 포인터(주소)가 한칸 감소.
(*p)++ // 포인터가 가리키는 값을 증가!!
함수에 인자로 포인터를 넘기면, 외부 인자의 값을 변경할 수 있다.
void swap(int *px, int *py) {
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
int a = 1, b = 2;
swap(&a, &b);
배열의 이름 == 포인터!
int A[5]; int *aPtr; // aPtr = A; aPtr = &A[0]; // 같은 의미!! A[0] == *(A+0); // 포인터로 표현하면 이렇게 된다. A[1] == *(A+1); A[2] == *(A+2);
위와 같이 포인터에 대한 사칙연산은 포인터가 가리키는 객체 단위로 계산된다.
int a;
int *p;
p = &a;
p+1 // a의 다음칸 : 뭐가 있는지 모름..
// int면 4byte double이면 8byte씩 이동하게 됨.
// 동적 메모리 할당할 때 배열을 넣으면 이런 식으로 이용하기 때문에 잘 알아두자.
struct {
int i;
float f;
} s, *ps;
ps = &s;
ps->i = 2; // 구조체 포인터에서 변수에 접근하려면 ->
ps->f = 3.14;
*을 중첩해서 포인터를 가리키는 포인터 변수를 만들 수 있다.
int a;
int *p;
int **pp;
*p = &a;
**p = &p; // 두개까지 쓸 일이 있다고?! 있더라...
int *pi = NULL;
int *pi;
float *pf;
pf = (float *)pi;
C는 정적 메모리 할당 언어임.
int buffer[1000]
이렇게 미리 선언해놔야 함.동적 메모리 할당
int *pi;
pi = (int *)malloc(sizeof(int) * 3); // int 3개의 사이즈만큼 메모리 블록을 할당해준다.
// pi가 필요한 작업 수행
free(pi);
js에서는 자동으로 해주는데...