[자료구조] #3 C언어 구조체, 포인터, 동적할당
3. 구조체
1. struct
- 배열 : 자료형(타입)이 같은 자료들을 하나로 묶는 방법
- 구조체 : 자료형이 다른 자료를 하나로 묶는 방법
지금 보니까 좀 속은 것 같다. 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; // 비교는 불가능!
2. 자기참조 구조체
구조체의 필드(변수) 중에서 자기 자신을 가리키는 포인터가 존재하는 구조체.
연결리스트 구현에 많이 이용한다!!
typedef struct _ListNode { char data[10]; struct _ListNode *link; // 포인터는 뭔데? } ListNode;
4. 포인터
다른 변수의 주소를 가지고 있는 변수!!!
1. 포인터 기본 문법
char a = 'A';
char *p;
p = &a; // & : 변수의 주소
*p = 'B'; // * : 가르키는 곳의 내용
p // 포인터의 값 (주소)
*p // 포인터가 가리키는 값
*p++ *(p++) // 포인터가 가리키는 값을 가져온 후, 포인터(주소)가 한칸 증가.
*p-- *(p--) // 포인터가 가리키는 값을 가져온 후, 포인터(주소)가 한칸 감소.
(*p)++ // 포인터가 가리키는 값을 증가!!
2. call by reference
함수에 인자로 포인터를 넘기면, 외부 인자의 값을 변경할 수 있다.
void swap(int *px, int *py) {
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
int a = 1, b = 2;
swap(&a, &b);
3. 배열과 포인터
배열의 이름 == 포인터!
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씩 이동하게 됨.
// 동적 메모리 할당할 때 배열을 넣으면 이런 식으로 이용하기 때문에 잘 알아두자.
4. 구조체의 포인터
struct {
int i;
float f;
} s, *ps;
ps = &s;
ps->i = 2; // 구조체 포인터에서 변수에 접근하려면 ->
ps->f = 3.14;
5. 포인터의 포인터
*을 중첩해서 포인터를 가리키는 포인터 변수를 만들 수 있다.
int a;
int *p;
int **pp;
*p = &a;
**p = &p; // 두개까지 쓸 일이 있다고?! 있더라...
6. 포인터 사용 시 주의할 점
- 포인터가 아무것도 가리키지 않을때는 NULL로 설정하자.
int *pi = NULL;
- 타입 변환 시에는 명시적으로!!!!
int *pi;
float *pf;
pf = (float *)pi;
5. 동적메모리 할당
C는 정적 메모리 할당 언어임.
- 메모리 크기는 프로그램 시작 전에 결정된다
- 프로그램 도중에 실행 크기가 변경될 수 없기 때문에,
int buffer[1000]
이렇게 미리 선언해놔야 함.
동적 메모리 할당
- 프로그램의 실행 도중에 메모리를 할당 받는 것.
- 필요한 만큼 받아서 사용하고, 필요 없어지면 반납해야함.
- 효율적으로 사용 가능.
int *pi;
pi = (int *)malloc(sizeof(int) * 3); // int 3개의 사이즈만큼 메모리 블록을 할당해준다.
// pi가 필요한 작업 수행
free(pi);
js에서는 자동으로 해주는데...
6. 작은 회고
- 오랜만에 C 보니까... 재밌다! 그치만 자료구조 코드들 본격적으로 복습하면 이중 포인터 때문에 헷갈리겠지..?
- 목요일에 2시간반 수업듣고 1시간 실습 과제하고
Author And Source
이 문제에 관하여([자료구조] #3 C언어 구조체, 포인터, 동적할당), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ddosang/자료구조-3-C언어-복습저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)