C언어 - 배열의 기본적인 사용방법

2020. 11. 11. 17:54개인공부/C언어

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define MONTHS 12 // symbolic constant, macro


int main() {

	/* Basic usage */
	int high[MONTHS] = { 2,5,11,18,23,27,29,30,26,20,12,4 };

	for (int i = 0; i < MONTHS; ++i)
		printf("%d ", high[i]);
	printf("\n");

	float avg = 0.0;
	for (int i = 0; i < MONTHS; ++i)
		avg += high[i];
	printf("Average = %f\n", avg / (float)MONTHS);

	high[0] = 1;
	high[1] = 2;
	//high = { 1,2,3,4,5,6,7,8,9,10,11,12 }; // Not working
	//high[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; // Not working
		
	printf("%p %p\n", high, &high[0]); // 둘이 동일하다.
}

 

대표하는 주소가 첫번째 주소다.

 

2 5 11 18 23 27 29 30 26 20 12 4
Average = 17.250000
0137FE4C 0137FE4C
20446796
20446800
20446804
20446808
20446812
20446816
20446820
20446824
20446828
20446832
20446836
20446840

 

주소가 4씩 증가한다.

 

 

16진수 주소대로 하면

 

2 5 11 18 23 27 29 30 26 20 12 4
Average = 17.250000
000000E6FF0FFAB0 000000E6FF0FFAB0
000000E6FF0FFAB0
000000E6FF0FFAB4
000000E6FF0FFAB8
000000E6FF0FFABC
000000E6FF0FFAC0
000000E6FF0FFAC4
000000E6FF0FFAC8
000000E6FF0FFACC
000000E6FF0FFAD0
000000E6FF0FFAD4
000000E6FF0FFAD8
000000E6FF0FFADC

 

4씩 증가한다.

 

 

 

당연하지만 const를 쓸수있다.

const int low[12] = { -7,-5,1,7,13,18,22,22,16,9,2,-5 };

 

 

 

 

 

// array가 초기화 되지 않았을때
	static int not_init[4];	// TODO : try static (storage class)
	for (int i = 0; i < 4; ++i)
		printf("%p\n", &not_init[i]);
	for (int i = 0; i < 4; ++i)
		printf("%d\n", not_init[i]);

// 주소들

00007FF63C2EC710
00007FF63C2EC714
00007FF63C2EC718
00007FF63C2EC71C

 

//값들

0
0
0
0

 

값을 초기화 시키지 않았으나 메모리 공간은 차지하고 배열들은 기본값인 0이 들어가있다.

 

 

 

	// 부분적으로 덜 초기화 될 때
	int insuff[4] = { 2,4 };
	for (int i = 0; i < 4; ++i)
		printf("%d\n", insuff[i]);

//값들

2
4
0
0

 

앞의 초기화 시킨 두 부분만 들어갔다.

 

 

 

//오버해서 초기화 시킨경우
	int over[2] = { 2,4,8,16 }; // 컴파일에서 에러를 캐치하고 표시해줌

 

 

	const int power_of_twos[] = { 1,2,4,8,16,32,64 };
	printf("%zd\n", sizeof(power_of_twos));
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(power_of_twos[0]));

	for (int i = 0; i < sizeof power_of_twos / sizeof power_of_twos[0]; ++i)
		printf("%d ", power_of_twos[i]);

배열의 길이를 정해주지 않아도 초기화 해주었다.

7개가 들어있으니 7로 컴파일러가 지정해준다.

 

28 // 배열의 크기 (int 7개니까 28)
4 // int의 크기
4 // 첫 배열의 크기
1 2 4 8 16 32 64 // for문으로 배열값들 출력

 

컴파일러가 7을 넣었으니 for문을 돌릴수 있다 (sizeof로 전체 배열의 크기를 알수있기 때문).

하지만 동적할당에선 저렇게 사용할수 없다.

 

 

 

	// 초기화 지정
	int days[MONTHS] = { 31,28,[4] = 31,30,31,[1] = 29 };
	for (int i = 0; i < MONTHS; ++i)
		printf("%d ", days[i]);

결과값 : 31 29 0 0 31 30 31 0 0 0 0 0

 

[0] : 31

[1] : 28 이었다가 뒤에 [1]=29로 바꿈

[2] : 0

[3] : 0

[4] : [2]와 [3]을 건너뛰고 [4]로 바로 초기화 했기때문에 [4]는 31, [2],[3]은 0을 초기화

[5] : 30 // [4]를 초기화한 바로 뒷값들 차례로 초기화됨

[6] : 31

[그뒤의 배열들] : 초기화 하지 않았으니 0으로.

 

 

	int arr1[MONTHS]; // Symbolic integer constant, 양의 정수만 가능
	double arr2[123]; //
	float arr3[3 * 4 + 1]; // 컴파일 타임에 계산되어 13으로 컴파일됨
	float arr4[sizeof(int) + 1];
	//float arr5[-10];  // 불가
	//float arr6[0];	// 불가
	//float arr7[1.5];	// 불가
	float arr8[(int)1.5]; // 가능, 절삭되어 1이 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 홍정모의 따라배우는 C언어