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", ¬_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언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 포인터와 배열 (0) | 2020.11.11 |
---|---|
C언어 - 포인터의 산술 연산 (0) | 2020.11.11 |
C언어 - 배열과 메모리 (0) | 2020.11.11 |
C언어 - NULL 포인터와 런타임 에러 (0) | 2020.11.11 |
C언어 - 포인터의 기본적인 사용 방법 (0) | 2020.11.11 |