IT

c언어 배열, 포인터, 구조체 본문

개발

c언어 배열, 포인터, 구조체

abcee 2019. 2. 25. 09:20


2015.03.08 지식in 작성글 이전


배열

 

배열은 데이터들이 순차적으로 저장 되어있는 선형리스트 중 하나로 볼 수 있어요.

그니까 배열은 데이터들을 순서대로 저장 해놓고 번호를 매겨 그 데이터에 직접 접근할 수 있도록 하는 자료를 저장하는 방식 중 하나예요.

 

1.         int arr[] = {1,2,3.}; 

2.        printf("%d",arr[1]); 

 

이렇게 arr 이라는 이름의 배열을 만들어 놓고 1,2,3 이라는 데이터를 순차적으로 저장해 놓은 후 arr 2번째 데이터를 사용하고 싶을 때는 arr[1] , 1이라는 인덱스 를 사용하여 직접 접근할 수 있도록 하는거지요.

 

하지만 배열은 데이터의 크기를 미리 정해 놓고 사용을 하기 때문에 데이터를 추가하거나 삭제하기에는 매우 불편한 자료구조이지요.

 

따라서 배열은 데이터의 삽입/삭제가 드물고 인덱스를 통해 데이터에 직접 (, 바로) 접근하여 수정 또는 사용하고 싶을 때 쓰지요.

 

포인터

프로그램에서 사용하는 모든 데이터들은 적어도 한번씩은 메모리(RAM) Load 되고 사용되요.

그리고 메모리에는 데이터가 저장될 수 있는 수많은 칸들이 있고 그 각각의 칸들마다 고유의 주소가 있지요.

포인터는 그 주소 값을 말해요.

, 칸에 저장 되어있는 실 값이 아니라 그 칸의 주소를 말하는거지요.

 

포인터를 사용하는 이유는 많지만 그 중 대표적인 것은 접근이 불가능한곳에서 그 데이터를 쓰고 싶을때에요.

 

예를 들어

 

1.         int swap(int * a, int * b){ 

2.          int temp; 

3.          temp = *a; 

4.          *a = *b; 

5.          *b = temp; 

6.          return 0; 

7.       

8.        int main(){ 

9.          int a = 5; 

10.        int b = 4; 

11.         swap(&a,&b); 

12.     

 

c언어에서 모든 지역 변수들은 해당 지역에서만 접근이 가능해요.

하지만 위의 경우처럼 다른 지역 (여기서는 다른 함수) 에서 해당 데이터에 접근을 하고 싶을 경우가 생기면 그 데이터가 저장 되어있는 주소를 매개변수로 넘겨 그 주소를 통해 접근할 수 있도록 만드는거지요.

 

또 하나의 경우는 큰 데이터를 매개변수로 넘기는 경우예요.

c언어에서 함수의 인수들은 그 값을 그대로 복사해서 넘기는 방식을 사용해요

, 변수 a 5라는 데이터를 함수의 인수로 사용한다면 a의 값인 5가 복사되어 넘어가는거지 a라는 변수 자체가 넘어가는 건 아니라는거죠.

 

1.         int add(int * arr){ 

2.          //배열의 모든 데이터를 더해서 return 

3.       

4.        int main(){ 

5.          int arr[5000]; 

6.          int sum; 

7.          //arr의 모든 인덱스에 데이터 삽입 

8.          sum = add(arr); // 배열의 이름은 배열의 첫번째 주소값으로 사용될 수 있습니다. 

9.       

 

따라서 위와 같은 경우처럼 배열의 크기가 5000 이 되는 상황에서 배열 전체가 인수로써 사용된다면

5000개의 값을 모두 복사해야 되므로 매우 비효율적인 방법이되요.

 

그래서 배열의 시작점에 해당하는 주소를 인수로 사용하여 그 배열에 직접 접근할 수 있도록 만드는 거지요.

 

하지만 포인터는 메모리의 주소 값을 통해 메모리에 직접 접근하는 것이므로 그 주소 값의 제어를 프로그래머가 정확하게 해야지 프로그램의 오류가 없어져요.

잘못된 주소에 접근하게 되면 프로그램이 제대로 작동하지 않을테니까요.

 

구조체

c언어에서 사용자에게 제공하는 데이터 형식은 기본적으로 정수,실수,문자 형의 데이터예요.

이것들은 프로그래머들이 가장 많이 사용하는 형식이고 데이터의 크기가 정해져 있어서 언어를 설계할 때 미리 구현을 해 놓은 상태이지요.

 

하지만 프로그래밍을 하다 보면 설계상 새로운 데이터형이 필요할 때가 있어요.

예를 들어 연결리스트 자료구조를 사용해야 된다던 가 아님 특정 개념의 속성을 묶어 사용해야 된다든가 말이죠.

 

1.         struct People { 

2.          char name[20]; 

3.          int age; 

4.        }; 

이런 식으로 위에서 처럼 사람이라는 새로운 데이터 형식을 쓰고 싶을 때 구조체를 사용하는거에요.

, 개념적으로 어떤 것들을 묶고 싶을 때 쓰는게 구조체이지요.

Comments