C언어 - 배열

Jocy·2022년 4월 29일
0
post-thumbnail

배열을 초기화 하는 방법

#include <stdion.h>
int main()
{
  int arr1[5] = {1, 33 , 47, 102, 155}; // 선언과 동시에 초기화
  int arr2[5] = {5}; // 0 번째 값을 5 로 초기화하고 나머지는 모두 0 으로 초기화
  int arr3[5] = {5, 10}; // 0 번째 값을 5, 1 번째 값을 10으로 초기화하고 나머지는 모두 0 으로 초기화
  int arr4[5] = {}; // 모두  0 으로 초기화
  int arr5[5]; // 초기화 하지 않음
  int arr6[] = {11, 22 , 33, 44}; // 배열의 크기가 4로 정해지면서 자동으로 초기화

  return 0;
}

배열을 초기화 하는 방법 정리

  1. 배열을 선언과 동시에 초기화 하는 방법
  2. 특정 자릿수까지만 초기화하는 방법
  3. 모든 값을 0으로 초기화하는 방법
  4. 초기화 값들의 개수에 맞게 자동으로 배열의 크기를 정해주는 방법

초기화 되지 않은 변수는 선언함과 동시에 변수는 메모리의 한 부분을 차지하게 되고
그래서 메모리 자체 값을 보여주게 되어 쓰레기값이 나오게 됩니다.
배열의 개수를 넘어서는 범위를 출력하거나 초기화하지 않은 배열을 출력해도 동일합니다.

배열의 주소

일반적으로 우리가 사용하는 변수들은 모두 메모리의 특정한 주소에 저장되어 있습니다. scanf를 사용할 때 주소값을 알려주기 위해 &를 사용한다고 했었는데요, 각 변수들은 선언될 때 메모리에 무작위로 저장됩니다. 그리고 각각 그 주소값을 갖고 있습니다.

그러나 배열은 선언한 크기 만큼 연속적으로 연결되어 있습니다.
배열을 int형으로 사용할 경우 배열 원소당 4바이트의 크기를 가지게 되는데
원소를 3개를 가진 배열 arr에서 0번째 원소가 주소 1000에 저장 되어있다고 가정하면
arr[0] 1000~1003번지 arr[1] 1004~1007번지 arr[2] 1008~1011번지까지 저장되는 것입니다.

저장되는 위치는 4바이트씩이지만, C언어에서는 주소를 나타낼 때 시작번지만을 나타냅니다.
시작번지와 자료형만 알면 끝이 어디인지는 금방 계산할 수 있습니다. 위 배열은 int형이기 때문에 4씩 증가했지만 1바이트인 char 배열의 경우 1씩, 8바이트인 double의 경우에는 8씩 주소가 증가합니다.
즉 연속된 각 원소끼리의 주소는 자료형의 크기만큼 차이납니다

배열의 크기 구하기1 (sizeof)

#include <stdio.h>

int main()
{
  int arr[] = {519, 31, 7988, 165326, 100, 150};

  printf("%d\n", sizeof(arr)); // 배열이 메모리 상에서 차지하고 있는 용량
  // int 는 4 바이트이고 6개가 있으므로 출력 결과는 : 24

  printf("%d\n", sizeof(arr) / sizeof(arr[0])); // 배열의 크기를 구하는 방법 중 하나
  // 배열의 전체는 24 바이트지만 요소 하나는 4바이트
  // 전체 배열을 요소 하나로 나누면 길이를 구할 수 있다
  // 출력 결과는 24 / 4 이므로 6
  
  return 0;
}

배열의 크기 구하기2 (for 문)

#include <stdio.h>

int main()
{
	int arr[5] = {1, 2, 3, 4, 5};
	int length = sizeof(arr) / sizeof(int);  // sizeof(arr) / sizeof(arr[0]) 과 같습니다

	printf("arr의 길이는 : %d\n", length);

	for(int i=0; i < length; i++)
	{
		printf("%d\n", arr[i]);
	}
	
	return 0;
}
profile
Software Engineer

0개의 댓글