728x90
C언어로 쉽게 풀어쓴 자료구조: 3장 배열, 구조체, 포인터
3.2 구조체
구조체란?
타입이 다른 데이터를 묶는 방법
struct studentTag{
char name[10];
int age;
double gpa;
};
※위의 문장은 구조체 형식만을 정의. 실제로 구조체가 만들어진 것은 아니다.
구조체를 만들려면 다음과 같의 정의
struct studentTag s; // struct 구조체이름 구조체변수;
구조체 안에 들어 있는 멤버를 사용하려면
strcpy(s.name, "kim");
s.age = 20;
s.gpa = 4.3;
typedef을 사용한 구조체 정의
typedef studentTag{
char name[10];
int age;
double gpa;
} student;
이 경우 student만을 사용하여 변수 선언이 가능해진다.
student s;
구조체는 중괄호를 사용하여 선언 시에 초기화하는 것이 가능하다.
student s = {"kim", 20, 4.3};
3.5 포인터
포인터란?
다른 변수의 주소를 가지고 있는 변수
& 연산자 | 주소 연산자 ➡️ 변수의 주소 추출 |
* 연산자 | 간접참조 연산자 ➡️ 포인터가 가리키는 곳에 값을 저장 |
int a; p = &a; // 변수의 주소를 포인터에 저장 |
&a = 0x0010 -> &는 변수의 주소 추출 |
*p = 200; // p가 가리키는 장소에 200을 저장 | *p -> a이므로 a에 200을 저장 |
void swap(int A, int B){
int temp = A;
A = B;
B = temp;
}
int main (){
int a = 10;
int b = 20;
printf("a = %d, b = %d\n", a, b);
swap(a,b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
출력
a = 10, b = 20
a = 10, b = 20
※ swap 종료시 swap에 저장된 값은 사라진다.
따라서 a와 b에 저장된 값을 swap하기 위해서는 포인터 연산자를 사용해야 한다.
void swap(int *A, int B){
int temp = *A;
*A = *B;
*B = temp;
}
int main (){
int a = 10;
int b = 20;
printf("a = %d, b = %d\n", a, b);
swap(&a,&b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
출력
a = 10, b = 20
a = 20, b = 10
3.6 동적 메모리 할당
왜 사용할까?
int scores[100];
학생의 성적을 저장하는 배열 scores는 크기가 100으로 고정되있다.
처음 결정된 '100' 이라는 크기보다 더 큰 입력이 들어온다면 처리하지 못할 것이고 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비될 것이다.
이러한 문제를 해결하기 위해 필요한 만큼의 메모리를 운영체제로부터 할당받아서 사용하고, 사용이 끝나면 시스템에 메모리를 반납한다. ➡️동적 메모리 할당(dynamic memory allocaton)
int *p;
p = (int *)malloc(sizeof(int)); // 동적 메모리 할당
*p = 100; // 동적 메모리 사용
free(p) // 동적 메모리 반납
- malloc() 함수는 size바이트 만큼의 메모리 블록을 할당
- sizeof는 변수나 타입의 크기를 숫자로 반환한다.(크기의 단위는 바이트)
- sizeof(int)는 int형의 크기를 반환한다. (4byte)
- malloc()은 동적 메모리 블럭의 시작 주소를 반환한다.
- 반환되는 주소의 타입은 void *이다. 따라서 이를 적절한 포인터로 형변환해야한다. (int *)
구조체와 포인터
구조체에 대한 포인터를 선언하고 포인터를 통하여 구조체 멤버에 접근할 수 있다.
(*p).i
p -> i
위의 두가지 방법으로 접근이 가능하다. (둘 다 같은 의미이다.)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct studentTag
{
char name[10];
int age;
double gpa;
} student;
int main(void)
{
student *s;
s = (student *)malloc(sizeof(student));
if(s == NULL)
{
fprintf(stderr, "메모리부족\n");
exit(1);
}
strcpy(s->name, "Park");
s->age = 20;
free(s);
return 0;
}
728x90
반응형
'C언어로 쉽게 풀어쓴 자료구조' 카테고리의 다른 글
[C언어로 쉽게 풀어쓴 자료구조] 7장 연결리스트 - Ⅱ (0) | 2024.11.23 |
---|---|
[C언어로 쉽게 풀어쓴 자료구조] 6장 연결리스트 - Ⅰ (1) | 2024.11.17 |
[C언어로 쉽게 풀어쓴 자료구조] 5장 큐 (0) | 2024.11.16 |
[C언어로 쉽게 풀어쓴 자료구조] 4장 스택 (0) | 2024.11.11 |
[C언어로 쉽게 풀어쓴 자료구조] 1장 자료구조와 알고리즘 (2) | 2024.11.05 |