-
1. 동적 배열Data Structure 2022. 1. 13. 15:51728x90
C언어 자료 구조에 대해서 공부를 시작했는데, 공부를 하면서 정리 차원에서 포스팅을 해볼까 한다.
자료구조 첫번째는 배열에 대한 소개이다.
배열에 대해서는 자바 언어 List 포스팅 및 최근의 백준 문제풀이에서도 정말 많이 볼 수 있는 것이므로 일반적인 것 외에 내가 몰랐던 방식들을 조금씩 정리하고자 한다.
배열이란? 같은 자료형의 변수로 이루어진 요소가 모여 직선 모양으로 줄지어 있는 자료 구조.
ex) int arr[5] -> 크기 5의 arr이름을 가진 int 타입의 배열
**배열 요소 개수 구하기
sizeof(a)/sizeof(a[0]) : 요소의 개수 구하는 공식
sizeof(a)로 전체 배열이 할당된 메모리 크기를 구하고, sizeof(a[0])로 첫 번째 요소가 할당된 메모리 크기를 구한다.
예를 들어, int a[5] 배열에서 sizeof(a)/sizeof(a[0])를 사용하게 되면 sizeof(a)는 20byte, sizeof(a[0])는 4byte 이므로 20/4=5 로 크기 5라는 결과를 얻을 수 있는 것이다.
-> 요소의 자료형이나 크기에 영향을 받지 않아 배열 요소의 개수 구하는데는 탁월하다.
**메모리 할당과 동적 객체 생성
- 선언과 정의의 차이
선언 : 실제 내용을 할당하지 않고, 메모리를 사용하지 않지만, 대상에 대한 정보를 알려줌.
정의 : 실제 내용을 할당하게 하고, 메모리를 사용한다.
- 메모리 구조
1. 데이터 영역 : 전역 변수와 정적 변수가 할당되는 영역. 컴파일러가 미리 공간을 예측
2. 스택 영역 : 지역 변수와 매개 변수가 저장되는 영역. 컴파일러가 미리 공간을 예측
3. 힙 영역 : 동적으로 메모리를 할당. 데이터와 스택 영역을 모두 할당하고 남은 공간으로, 시스템의 메모리 영역의 여유 공간에 따라 달라짐. 동적할당을 통한 동적 변수를 관리 하기 위한 영역. calloc, malloc 함수를 사용해 동적으로 생성하는 변수를 저장하기 위해 할당하는 영역이다.
- calloc함수 사용
int *x;
x = calloc(1, sizeof(int)); -> int 형 포인터 x에 메모리를 자료 1개가 들어갈 만큼 할당한다.
free(x); -> 메모리를 할당 하는 작업 후 반드시 마지막에 메모리 할당을 해제하는 free함수를 사용해야한다.
- calloc함수로 배열 만들기
int *a;
a = calloc(5, sizeof(int));
free(a);
-> int 형 포인터 a에 메모리를 자료 5개가 들어갈 만큼 할당해 주었다. 이런식으로 크기 5짜리 int형 타입의 배열 a를 동적으로 생성해 낼 수 있다.
**포인터로 배열 표현하기
포인터 p가 배열의 요소 e를 가리킬 때
요소 e의 i개 만큼 뒤쪽 요소는 *(p+i)이다. -> *(p+i)는 p[i]이다.
요소 e의 i개 만큼 앞쪽 요소는 *(p-i)이다. -> *(p-i)는 p[-i]이다.
ex)
int a[5];
int *p = a;
p = &a[0]; //맨처음 0인덱스 값을 가리킬 때
*(p+i) = *(a+i) = p[i] = a[i] 이다.
728x90'Data Structure' 카테고리의 다른 글
6. List#1 - LinearList (0) 2022.03.20 5. Recursion(재귀) (0) 2022.03.19 4. Queue(큐) (0) 2022.01.28 3. Stack(스택) (0) 2022.01.27 2. Search(선형 검색 & 이진 검색) (0) 2022.01.21