본문 바로가기

카테고리 없음

02 기본 자료구조 -1. 배열 (1)

자료구조 : 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계

데이터 단위 - 데이터를 구성하는 덩어리

자료구조 - 자료를 효율적으로 이용할 있도록 컴퓨터에 저장하는 방법

 

배열

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는 배열을 수정하지 못하도록 함