개발/C

[C언어] 배열(array), sizeof

섭교수 2022. 5. 28. 09:00
반응형

#C언어

1. Array

array는 배열로 번역되며 행렬과 유사한 구조를 가지고 있습니다.

(1) array 선언

 

 
int a[10];                      //{0,0,0,0,0,0,0,0,0,0,0}
int b[5] = {1,2,3,4,5};         //{1,2,3,4,5}
char c[5] = {'a','b','c'};      //{'a,'b','c','',''}
float d[5] = {0}                //{0,0,0,0,0}

구문은 위와 같습니다.

아래는 배열 출력 예제입니다.

 

#include <stdio.h>

int main(void) {
	char c[5] = { 'a','b','c' };
	for (int i = 0; i < sizeof(c); i++) {
		putchar(c[i]);
	}
	
	for (int i = 0; i < sizeof(c); i++) {
		printf("%d", c[i]);
	}
	return 0;
}

 

 

※ 배열크기는 변수를 사용할 수 없으며(가능한 컴파일러가 있긴 한데 visual studio에서는 미지원) 상수를 사용해야 합니다.

 

 

특정 위치에 저장하고 싶을 때는 a[5] = 6; 처럼 입력하면 됩니다.

만약 배열의 크기보다 적은 수의 원소를 입력하면 가장 앞부터 순서대로 저장되고 나머지에 0이 저장됩니다.(문자열의 경우 공백'')

 

 

※ a[3] = {2}; 는 틀린 구문입니다. a의 4번째 index a[3]에 2를 저장하고 싶다면 a[3] = 2; 를 입력해야 합니다.

 

(2) 배열원소의 접근

배열원소의 접근은 index(0부터 배열크기-1까지)를 이용합니다.

int a[10];                      // ?
int b[5] = {1,2,3,4,5};         //{1,2,3,4,5}
char c[5] = {'a','b','c'};      //{'a,'b','c','',''}
float d[5] = {0}                //{0,0,0,0,0}

int a[10]; 선언 후 a[10] = 10; 을 실행하면 에러가 납니다.

배열 a의 사이즈가 10이기 때문에 가능한 index는 0부터 9까지입니다.

아래는 입력한 10개의 숫자를 배열에 저장해서 역순으로 출력해주는 예제입니다.(배열 자체가 역순이 되는 건 X)

 

/* Reverses a series of numbers */
#include <stdio.h>
#define N 10

int main(void)
{
    int a[N], i;
    printf("Enter %d numbers: ", N);
    for (i = 0; i < N; i++){
        scanf("%d", &a[i]);
    }
    printf("In reverse order:");
    for (i = N - 1; i >= 0; i--){
        printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
}

 

(3) designated initializers

특정 위치에 값을 한꺼번에 저장할 수 있습니다. (위 경우 할당되지 않은 곳에는 0이 저장됩니다.)

만약 배열의 크기가 정의되지 않았다면 가장 큰 designator를 배열의 마지막 인덱스 (크기-1)로 가져갑니다.

 

2. sizeof

 

sizeof 연산자는 저장공간의 크기를 바이트 수로 반환하는 연산자이며 단순히 배열의 크기를 나타내는 연산자가 아닙니다.

 

(1) 배열크기 계산방법 : sizeof(배열이름) / sizeof(배열원소)

3. 반복되는 수가 있는지 판별하는 예제

 

define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	int digit_seen[10] = { 0 };
	int digit;
	long n;
	printf("Enter a number: ");
	scanf("%ld", &n);
	while (n > 0) {
		digit = n % 10;
		if (digit_seen[digit]) {
			break;
		}
		digit_seen[digit] = 1;
		n /= 10;
	}
	if (n > 0) {
		printf("Repeated digit\n");
	}
	else {
		printf("No repeated digit\n");
	}
	return 0;
}
​
반응형