C

배열

룸훼훼 2010. 6. 18. 09:16
반응형

◎배열◎
배열이란?
-배열이란 같은 데이터형을 가진 변수들의 연속적인 집합이라고 할수있으며
배열은 많은양의 데이터를 처리하는 경우 유용하게 사용할수 있다.
또 배열은 메모리가 연속적이기 때문에 배열의 시작주소를 알면 모든 배열 요소를 접근 할 수 있다.
한마디로 배열은 연속적인 메모리의  할당이라는것임.

-배열선언에 필요한 세가지
1) 배열 길이 : 배열을 구성하는 변수의 개수 (반드시 상수를 사용)
2) 배열 요소 자료형 : 배열을 구성하는 변수의 자료형
3) 배열 이름 : 배열에 접근할 때 사용되는 이름
* 배열 요소의 위치를 표현 : 인덱스(index)


(구조)

 






int형으로 array라는 이름을 선언해주고 int형 데이터 6개를 저장할 수 있는 메모리공간을 4byte씩 총 24byte만큼 할당해주소~선언했다.
만약 char형태로 선언하게되면 char형 데이터 6개를 저장할 수 있는 메모리공간을 할당하겠다 하는 소리.










인덱스는 0에서부터 시작된다.
먼저 인덱스란 뭔가하면 왼쪽부터 사람이 차례대로 6명이 서있다고 생각해보자.
그러면 왼쪽 부터 번호가 '1,2,3,4,5,6' 이 될것이다. 하지만 아쉽게도 이것은 인덱스가 아니다.
인덱스란 기준을 대상으로 멀리 떨어져있는 거리정도 라고 생각 하면된다.
그러면 왼쪽부터 '1'을 기준으로 떨어져있는 거리정도는 '0'이된다.
이제 접근을 시도해 보자 .
array[3] = 10; 이라고 하면  '3'이 인덱스 요소에 10을 넣어라는 소리이다..
 

이게 배열이다..-_-; 간단한가?
그런데 여기서 의문? 왜 배열은 0부터 시작하나?
메모리의시작은 항상 0값이기때문이다.간단하다.ㅋㅋㅋ

그럼 문자를 넣을수는 없나?
당연히 있다~
예제)

#include <stdio.h>
int main()
{
 char a[5] = "good";
 char b[] = "morning";

 printf("%s \n", a);
 printf("%s %s\n", a, b);

 return 0;
}
-----------------------------
결과값


문자열이 출력이 가능하다는것을 알게 되었다.
그러면 여기서 또 의문이 생긴다.
good라는 글자는 4글자다. 그러나 분명 5개의크기라고 명시해 주었는데
4개만 출력 했다 그럼 나머지 한개는??
간단히 설명된다. 문자열을 선언하게 되면 문자열끝에 null문자가 자동적으로 삽입 된다.
그냥 문자열의 끝을 의미하는 문자가 바로 null이다.
그리고 "good morning"이라는 문자열을 출력했다.
char b[] = "morning"; 이라고 선언한 부분에 배열 길이가 빠져있다.
이렇게 배열길이를 빼놓고 선언하게 되면 문자열의 길이만큼 초기화되면서
알아서 컴파일러가 배열의크기를 잡아준다~

또하나 알고 넘어가야할것이 있다.
예로  char a[13] = "good  morning"; 라는 식으로 배열의 길이를 
13로 잡았다. 하지만 문자열은 11개이다. 왜?? 남는건가??
"good"다음에 공백이 있다. 문자열을 배열에서 표현할때 공백문자도 문자열에 포함된다는것이다.
그리고 역시 null문자 또한 포함된것이다.
 


◎ 2차원 배열, 다차원 배열 ◎
1차원 배열의 내용을 이해했다면 2차원도 이해가 가능지 싶다.

1차원 배열은 index 하나(열)를 사용하여 선형적으로 배열의 요소에 접근하며 (arr[i] 처럼)
2차원 배열은 index 두개(행과 열)를 사용하여 2차원적으로 배열의 요소에 접근한다. (arr[i][j] 처럼)

구조를 보면 너무나도 간단하다. 금방 이해가 된다.
이렇게 2차원이상의 배열을 다차원배열이라하며 접근방법을 2차원적 혹은 3차원적으로 해석할뿐
1차배열과 살재 메모리 구성은 동일하다.
즉ㅡ 2차원배열이라고 해서 메모리구조는 2차원적으로 되는것이 아니라는 소리~
또 간단하다.
그러면 이거는 어떻게 쓰나?

그렇다면 3차원 , 4차원 이상부터~ ∞ (무한대)차원 의 배열은???
결론만 말하자면 굳이 알필요 없다고 생각한다.  알려고 찾아보니 너무..-_-;;
3차원배열은 큐브라고 생각하면 되겠고~ 4차원은...음...어...
아인슈타인이 얘기 했다고 하는데   x 축 , y축 , z축과 함께 시간의 축이 더해진것이 4차원 배열이라...
고..한..다나.. 아무튼.. 굳이 3차원 배열 도 잘 사용을 하지 않는다는데..
넘어가고..

문제!


*그림과 같은 출력 형태로 만들어라~
배열과 for문만 있으면 완성.
단. 번호는 1부터 시작해야한다~
(답은 더보기 클릭.ㅋ)


 


포인터와 배열의 관계
예제)(t1)
-------------------------------------------------
#include <stdio.h>

int main()

{
 int a[5] = {0, 1, 2 ,3 ,4};
 
 printf("%d, %d\n", a[0], a[1]); //배열 요소 출력
 
 printf("%d, %d\n", &a[0], &a[1]); //배열 요소주소 출력

 printf("배열 이름 : %d\n", a); //배열 이름 출력

 return 0;
}
-------------------------------------------------
출력-


-------------------------------------------------

배열의 요소를 출력했을경우 0 과 1이 출력 되었고
&를 붙여 주소값을 출력 했을때 1245036, 1245040 이 나왔다
그리고 배열의 이름을 출력 했을경우 1245036이 나왔다.
뭔가 감이 오는가..
배열의 이름과 출력된 주소값 첫번째가 같다는것. 이것은 배열의 이름은 첫번째 요소의 주소값을 나타내는것이다.
포인터와 관계가 있다는 것은 여기에있다.
먼저 포인터와 배열의 같은점은?
1번 이름이 존재한다는것이다. 예(a)
2번 둘다 메모리의주소값을 나타낸다.
이제는 다른점을 보면~포인터는 변수 배열의 이름은 상수라는것이다.
즉 배열은 대입연산자 (=)를 사용할수 없다는것이다.

그러면 이제는 포인터를 어떻게 쓰느냐~가 문제이다.
먼저 포인터의 이름 처럼 사용해 보자~
예제)(t2)
#include <stdio.h>

int main(void)
{
 int arr[3] = { 0, 1, 2 };
 int *ptr;

 ptr = arr;
 
 printf("%d, %d , %d \n", ptr[0], ptr[1], ptr[2]);
 return 0;
}
-------------------------------------------
결과


-------------------------------------------

반응형

'C' 카테고리의 다른 글

함수 -  (0) 2010.08.06
포인터  (0) 2010.08.06
코딩 및 컴파일 과정  (0) 2010.05.12
C언어 역사  (0) 2010.05.12
프로그래밍언어 비교  (0) 2010.05.12