자료구조 : 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계
데이터 단위 - 데이터를 구성하는 한 덩어리
자료구조 - 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법
배열
Ex)
학생들의 시험 점수
int jina; int yeoneui; int yoonmi; …. int hyungyu; 로 변수를 선언할 경우
-> 변수간의 관련성이 명확하지 않다, 실수의 가능성
배열: 같은 자료형의 변수로 이루어진 요소(element)가 모여 직선 모양으로 줄지어 있는 자료구조
선언:
자료형 배열 이름[요소 개수];
int형 요소 5개의 배열 => int a[5];
*요소 개수는 상수만 사용 가능
(상수식은 실행 시점(run-time)이 아닌 컴파일 시점(compile-time)에 계산된다)
#define N 5
...
int a[N];
인덱스=> 배열의 요소에 접근
0부터 시작 ~ n-1
a[i]는 배열 a에서 처음부터 a개 뒤의 요소에 접근
int a[5] 에서 각각의 요소는 단일로 선언한 int형 변수와 성질이 같다 => 자유롭게 값 대입 가능
=> 배열a의 자료형을 int[5]형이라고 한다.
int a[5]={1,2,3,4,5}; // 배열의 선언
int na=sizeof(a)/sizeof(a[0]);
//요소 개수를 구하는 방법
//sizeof(a[0])=sizeof(int)=4
배열을 요소 개수로부터 자유롭게 만들기
<stdlib.h>
calloc 함수
void *calloc(size_t nmemb, size_t size);
즉 *calloc(개수, 자료 한 개의 사이즈);
-> 크기 size * nmemb개 크기의 메모리 할당
모든 비트가 0으로 초기화됨
첫 번째 포인터를 반환(실패시 NULL 포인터 반환)
malloc 함수
void *malloc(size_t size);
-> 크기 size인 메모리 할당
첫 번째 포인터를 반환(실패시 NULL 포인터 반환)
stdio.h에 정의된 NULL
#define NULL ( (void *) 0 )
메모리 해제 - free 함수
void free(void *ptr);
-> ptr이 가리키는 메모리를 해제함
NULL이거나 이미 해제되었거나 동적할당된 포인터가 아니면 아무것도 하지 않음
배열의 동적 생성-
자료형을 지정하지 않아도 된다
(객체 생성x, 메모리 영역 확보)
C언어의 메모리 구조
할당 시기 : 프로그램이 실행될 때마다
할당 장소 : 메인 메모리 (RAM)
데이터 Data 영역
- 전역 변수와 정적 변수 할당
- 프로그램 시작할 때 할당, 종료할 때 해제
스택 Stack 영역
- 함수 호출 시 생성되는 지역 변수, 매개변수
- 함수 호출이 완료되면 사라짐
힙 Heap 영역
- 동적 메모리 할당
- 할당할 메모리의 크기를 프로그램이 실행되는 동안 (run time) 결정해야 하는 경우에 사용
실습
int *x;
x=calloc(1, sizeof(int)); 로 대입도 가능
x는 할당한 메모리의 주소값을 갖는 포인터
*를 통해 그 주소의 공간을 변수 공간으로 인식
*x : int형 변수 (마치 int a;로 선언한 a)
*x=57; 대입 가능 (a=57과 같은 방식)
free(x); 해당 주소의 메로리를 해제
개수,사이즈를 calloc 함수의 인수로 전달 -> 총 크기가 (개수*사이즈)인 메모리영역을 할당
void 포인터
모든 자료형의 객체를 가리킬 수 있다.
void포인터의 값 -> 모든 자료형의 포인터에 대입
모든 자료형의 포인터 값 -> void 포인터에 대입
포인터와 배열
p에 배열의 주소를 대입했을 때
p는 배열의 첫번째 요소를
p+i는 그보다 i개 뒤의 요소를 가리킴
==> p+i는 (i+1)번째 요소를 가리킴
식 a[i] *(a+i)
포인터 &a a+i
p에 a[4]의 주소 a를 대입
*p는 주소 a가 가리키는 값 *a=a[0]=1
*(p+i) 는 주소 a+i가 가리키는 값=*(a+1)=a[i]
p의 인덱스로도 접근이 가능하다
배열에서 최댓값 구하기
최댓값을 a[0]으로 설정해 놓고 a[i]값과 비교하면서 교체하는 알고리즘
함수
height에 배열 주소를 할당받아 height를 진짜 배열처럼 요소에 접근할 수 있다
maxof 함수의 파라미터로 const int a[]가 있다. 호출할 때 주소값인 height가 들어갔다.
c언어의 함수 선언에서 매개변수의 배열 표기는 포인터를 선언하는 것과 같다
즉 전달된 값을 a에 대입한다
주소 height를 대입받아 a[i]로 실제 배열에 접근하는 것
const는 배열을 수정하지 못하도록 함