본문 바로가기
Study

20120711_1차원 배열과 포인터

by hyeongjin's_life 2012. 11. 20.

1차원 배열과 문자열

1. 배열

A. 배열의 선언


변수를 선언하면 초기화를 해야 하듯이 배열도 초기화가 필요하다. 초기화 되지 않은 배열의 원소에는 어떤 값이 들어 있을지 알 수 없다. 초기화는 인덱스를 이용하여 각 원소 별로 값을 대입해도 되고 배열을 선언하면서 한꺼번에 초기화 할 수도 있다.

Ex1) 학생들의 점수를 배열에 저장하고, 총점과 평균을 계산하는 간단한 성적처리 프로그램


< 결과 >

총점 : 662

평균 : 82.75

B. 배열과 문자열

두 글자 이상 연속해서 붙어 있으면 문자열이라고 한다. Int, char, short, float, double 등의 다른 데이터 타입은 모두 크기가 정해져 있지만 문자열은 크기가 정해져 있지 않기 때문에 문자열 끝에 ‘\0’(null) 이라는 문자를 붙여서 끝을 알 수 있도록 하였다. Printf 함수는 %s 서식문자가 문자열로 대치될 때, 글자를 한 자씩 화면에 출력하다가 ‘\0’ 을 만나면 문자열이 끝났다는 사실을 인식하고 출력을 멈추게 된다. 만약 마지막에 \0 이 없으면 printf 함수는 문자열을 끝까지 출력하기 위해 \0 이 나올 때까지 메모리 공간을 헤메게 된다.

Ex2) 문자열을 배열에 저장하고 활용하는 예


< 결과 >


2. 포인터

A. 포인터의 필요성

배열은 크기가 조정되어 있기 때문에 배열의 크기는 항상 상수로 지정해야 하고, 한번 결정된 크기는 프로그램 수행 중에 바꿀 수 없다.

포인터는 메모리 주소를 나타내는 복잡한 숫자가 들어있을 뿐이지만 포인터가 가리키는 곳에 가면 처리해야 할 데이터가 저장되어 있다.

B. 포인터 변수의 선언

Int *ptr;

변수 이름 앞에 *기호를 붙여 선언하면 포인터 변수가 된다. 앞에 int를 써 준 것은 이 포인터가 가리키는 곳에 가 보면 int형 데이터가 저장되어 있다는 것을 나타낸다. 가리키는 곳에 있는 데이터의 타입까지 선언해 주는 이유는 메모리 주소만 가지고는 거기 저장된 값을 어떻게 해석해야 할지 알 수 없고, 데이터 타입이 뭔지 알아야 하기 때문이다.

C. 포인터 변수의 사용

Int *ptr = 메모리 주소

Ptr[0] = 0;

Ptr[1] = 10;

Ptr[9] = 90;

이와 같이 하면, ptr[0]은 포인터 ptr이 가리키는 위치에 저장된 데이터를 나타내고, ptr[1]은 바로 그 다음 위치, ptr[2]는 또 그 다음 위치의 데이터를 나타낸다. , 포인터를 이용해도 배열과 같이 연속된 데이터를 일괄 처리할 수 있다.

D. 포인터 변수의 초기화

초기화를 하지 않으면 선언한 값에 어떤 값이 들어 있는지 알 수 없다. 포인터의 경우 포인터가 가리키는 위치부터 연속된 데이터가 전부 망가질 수 있다. 변수를 선언하는 시점에는 이 포인터 변수를 이용해 처리하고자 하는 데이터가 어느 위치에 들어있는지 알 수 없는 경우가 많은데, 이럴 때는 NULL로 초기화 한다.

Int *ptr = NULL;

NULL 0으로 정의되어 있는데, 메모리의 0번지를 가리킨다기 보다는 포인터가 아직 유효한 값으로 초기화되지 않았음을 나타낸다.

E. 메모리 할당과 해제


Malloc 함수는 메모리 공간만 할당할 뿐 그 안에 어떤 데이터 타입이 저장될 지는 모르기 때문에 리턴 값을 void * 타입으로 내준다. Void *는 아직 데이터 타입이 결정되지 않은 포인터라는 뜻이다. 여기에 int형 데이터를 저장하려면, (int *)형으로 캐스트 해서 받으면 된다.

malloc함수는 할당 받고자 하는 메모리 크기를 한번에 지정하지만, calloc함수는 데이터의 개수와 크기로 나누어 지정하도록 되어 있다.

realloc함수는 기존에 할당 받아 사용하고 있던 메모리 바로 뒤에 여유 공간이 있을 때는 그 공간을 터서 사용할 수 있게 해주고, 그렇지 안ㄶ으면 여유가 있는 다른 곳에 메모리를 할당하고 기존의 데이터를 모두 이쪽으로 복사해 준다. 따라서 realloc 함수를 호출하고 나면 기존의 포인터가 그대로 유지될 수도 있고 변경될 수도 있다.

메모리를 할당 받는 세가지 함수 malloc, calloc, realloc은 모두 메모리가 바닥나 더 이상 할당할 수 있는 메모리가 없는 경우엔 NULL을 리턴한다. 또한 메모리를 다 쓰고 난 후에는 free 함수를 사용하여 반납한다.

Free(ptr);

Malloc, calloc, realloc, free 함수는 모두 표준 함수이고, 이들ㅇ을 사용하려면 <malloc.h>include 해야 한다.

F. 포인터의 활용

Ex3) 포인터를 이용한 성적처리 프로그램