C 언어의 「배열」의 구조를 풀어 밝힌다! 【초보자용】

2910 단어 C
picture

이번은 C언어에 있어서의 「배열」의 구조에 대해 설명하고 싶습니다!

배열이란?



여러분 알고 있다고 생각합니다만 일단.
배열이란 같은 형태의 데이터를 복수 배열한 것입니다.
(C언어 이외의 배열은 다른 형태도 같은 배열에 포함할 수 있습니다만...)

예를 들어, int a[10] 라고 선언된 배열은 int형의 요소를 10개 가진 배열이 되어,
i번째 요소는 a[i-1] 로 접근할 수 있습니다. (0번째부터 시작하는 것에 주의!)

배열의 정체



그렇다면이 배열의 정체는 무엇입니까?
a[i] 라고 쓰면 a의 i번째의 요소를 꺼낼 수 있습니까?

C 언어에서 배열은 연속적인 메모리 영역에 요소를 배열한 것으로 정의되고 배열의 요소에 대한 액세스는 배열의 선두 요소의 메모리 주소에 요소의 인덱스를 오프셋으로 더한 주소 값을 참조한다. 에서 이루어집니다. 자세히 살펴 보겠습니다.

예를 들어,

int a[10];
for (int i = 0; i < 10; i++) {
  a[i] = i;
}

이와 같이 0~9의 숫자가 격납된 배열 a가 있다고 합니다.
이 때 a는 배열 a의 첫 번째 요소의 주소를 나타냅니다.

여기서 C 언어에서 *a는 포인터 a가 가리키는 주소의 내용을 나타내므로
a[0] 즉 배열의 최초의 요소는 *a 라고도 쓸 수 있습니다.
그렇다면 a[1]은 무엇을 가리키는가? ?
방금 배열은 연속적인 메모리 영역에 요소를 늘어놓은 것이라고 말했습니다.
즉, 배열 a의 요소 a [1]이 저장된 주소는 요소 a [0]의 다음 주소입니다.
예를 들어, a[0]의 주소가 1000이라면 a[1]은 1001, a[2]는 1002, 와 같이 연속합니다.

여기까지 알면 배열의 대부분을 알게 된 것 같습니다.
a[1]은 무엇을 가리키는가? ? 라는 대답은 *(a + 1)을 가리키고 있다는 것이 정답입니다.
a[2]이면 *(a + 2) , a[3]이라면 *(a + 3)
이와 같이, C언어에서는, 본래라면 *(a + i) 라고 써야 할 곳을,
메모리 어드레스를 지정하는 포인터를 직접 조작하는 것은 에러의 원인이 되는 경우가 많기 때문에,
a[i]라고 쓸 수 있게 되어 있습니다.
즉,a[i] = *(a + i) 그래서 i[a] 라고 써도 같은 결과를 얻을 수 있습니다.
(물론 오해를 낳는 쓰는 방법이므로 그만두는 편이 좋지만 ^^;)

덧붙여서, 이와 같이 프로그램의 의미로서는 같은 것을, 보다 알기 쉬운 구문으로 쓸 수 있는 것을 당의 구문이라고 합니다.

이상입니다. 수고하셨습니다! !

블로그를하고 있습니다!



그때 범인이 움직였다

좋은 웹페이지 즐겨찾기