본문 바로가기

프로그래밍/C 기초

[C언어 강좌] #14 - 배열

이번에는 배열을 배워보겠습니다.






이런 코드가 있을때 변수를 하나하나 선언하기는 힘듭니다.

사람 100명이 있는데 100명마다 변수를 하나씩 선언하는건 그야말로 노가다겠죠.


하지만 배열을 이용하면 한번에 선언할수 있습니다.




이런식으로 변수이름뒤에 [길이]를 적어주는겁니다.

저 코드는 100개의 int형 변수를 선언하게 되는겁니다.



그리고 배열변수는 위와같이 초기화할수 있습니다.



그리고 위와같이 연산하거나 참조할수도 있습니다. abc[3]을 배열에 4번째에 있는 변수에 해당합니다.

abc[3]인데 왜 4번째일까요?

그건 배열이 0부터 시작하기때문입니다. abc[0] , abc[1],. abc[2] .... abc[9]로 0부터 순서대로 있습니다.



길이가 10 이상으로 길어질경우 오류가나는걸 볼수있습니다.



배열이 0부터시작하는건 배열의 메모리구조를 보면 알수있는데요.


배열이란놈은 대충 이렇게 생겨먹었습니다. 저 한칸마다 int형변수 한개씩 들어있다고 보시면 됩니다.

그리고 abc는 바로 저 배열의 첫번째 공간의 메모리주소를 담고있는것입니다.



실제로 abc를 출력해보면 그 배열의 메모리주소가 나옵니다!

메모리주소에 대해서는 저번에 scanf를 배울때 잠깐 배운적이 있었죠.


[C언어 강좌] #7 - scanf , 메모리 주소 <- 이 강좌에서 주소와 관련해서 설명한적이 있었습니다.


변수앞에 &를 붙여서 변수의 메모리주소를 가져올수 있었다고 배웠었죠.



abc[0]의 주소를 가져와보면 abc의 주소와 똑같습니다. 신기하죠?


abc[  ]이부분에 넣는 숫자의 정체는 이 숫자를 넣은만큼 메모리주소를 이동하는겁니다.





abc[0]이 기준이되는 메모리주소로 뒤에 적는 숫자에따라서 메모리공간을 얼마나 이동하는지 결정됩니다.


근데 실제로 메모리공간은 저따구로 생겨먹지 않았죠? 컴퓨터는 모든것을 0과 1로 표현합니다.




대충 이런느낌이라고 보는게 더 정확하겠죠.

배열이 int형변수를 담고있고 int형변수는 4바이트기때문에 4바이트씩 이동하게됩니다.

하나의 메모리주소당 1바이트씩 담고있으니 이동할때마다 주소가 4씩 늘어나게되죠.



한번 abc[0]과 abc[1]의 주소값을 출력해서 비교해보면 한번에 4가 늘어난것을 볼수 있습니다.

2바이트의 변수에서 이동하면 2씩, 8바이트면 8씩 늘어나겠죠.


그리고

int a[5];

a[3] = 10;

이 두가지에서 쓰이는 [5]와 [3]은 다른것입니다.

a[5]는 int형변수를 5개 만든것과 같은가지인겁니다. 여기서 [5]는 크기를 나타내는거죠.

하지만 a[3] = 10;에서는 몇번째 메모리주소로 이동하는지 적어놓는겁니다.