[C언어 스터디 - 01] 1차원 배열 (1D Array)

2020. 6. 21. 20:1203. Resources/C, C++

728x90
반응형

1차원 배열

참고 문헌 (Ch36): https://dojang.io/mod/page/view.php?id=292

배열의 선언

(자료형) (배열이름)[크기] = {초기값};

int numArr[10] = {1,2,3,4,5,6,7,8,9,10}; //정수형의 값을 10개를 가지는 배열을 선언하고, 초기값을 {1,2,3,4,5,6,7,8,9,10}로 지정

int numArr2[] = {1,2,3,4,5,6,7,8,9,10}; // 크기를 선언하지 않음    
// 정수형의 값을 가지는 배열인데, 초기값을 {1,2,3,4,5,6,7,8,9,10}로 지정하고, 크기도 선언한 초기값의 크기와 동일하게 지정   

배열 원소 접근

(배열이름)[인덱스]

10개를 선언 => 배열의 인덱스는 0부터 9까지, 즉 첫번째 값이 0의 인덱스를 가짐


배열 원소를 0으로 초기화

(자료형) (배열이름)[크기] ={0,};

int numArr[10] = {0,};
//위와 같이 {0,}을 입력으로 주게 되면 선언한 배열의 모든 값이 0으로 바뀜

배열에 값 할당

(배열이름)[인덱스] = 값;


배열의 크기

sizeof((배열이름)) = 메모리 상에서 배열이 차지하는 전체 공간

sizeof((배열이름)) / sizeof((배열 선언에 이용한 자료형)) = 배열의 크기 (요소 개수)


반복문으로 배열 값 출력

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    // sizeof(numArr) / sizeof(int) : 배열 요소의 개수가 변해도 대응할 수 있도록
    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)    // 배열의 요소 개수만큼 반복
    //for (int i = sizeof(numArr) / sizeof(int) - 1; i >= 0; i--)    // 요소 개수 - 1부터 역순으로 반복
    {
        printf("%d\n", numArr[i]);    // 배열의 인덱스에 반복문의 변수 i를 지정
    }

    return 0;
}

배열 요소의 합계

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열
    int sum = 0;    // 합을 저장할 변수는 0으로 초기화 => 초기화를 안하면 처음에 쓰레기 값이 들어있기 때문에 정상적으로 합을 계산할 수 없음

    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)    // 배열의 요소 개수만큼 반복
    {
        sum += numArr[i];    // sum과 배열의 요소를 더해서 다시 sum에 저장
    }

    printf("%d\n", sum);    // 605

    return 0;
}

배열 각 요소의 값을 두 배로

전체 요소에 대해서 접근하기 위해서 반복문을 무조건 돌긴 해야한다.

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)    // 배열의 요소 개수만큼 반복
    {
        numArr[i] *= 2;    // 배열의 요소에 2를 곱해서 다시 요소에 저장
    }

    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)    // 배열의 요소 개수만큼 반복
    {
        printf("%d\n", numArr[i]);
    }

    return 0;
}

배열을 포인터에 넣기

배열을 선언할 때 쓰인 배열이름만 단독으로 사용하는 경우, 배열 첫번째 값의 주소값이 리턴된다. 즉 배열이름은 포인터의 역할을 한다고 볼 수 있다.

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    int *numPtr = numArr;       // 포인터에 int형 배열을 할당 (배열 이름 = 첫번째 원소의 주소값)

    printf("%d\n", *numPtr);    // 11: 배열의 주소가 들어있는 포인터를 역참조하면 배열의 첫 번째 요소에 접근 

    printf("%d\n", *numArr);    // 11: 배열 자체를 역참조해도 배열의 첫 번째 요소에 접근

    printf("%d\n", numPtr[5]);  // 66: 배열의 주소가 들어있는 포인터는 인덱스로 접근할 수 있음

    printf("%d\n", sizeof(numArr));    // 40: sizeof로 배열의 크기를 구하면 배열이 메모리에 차지하는 공간이 출력됨

    printf("%d\n", sizeof(numPtr));    // 4 : sizeof로 배열의 주소가 들어있는 포인터의 크기를 구하면 포인터의 크기가 출력됨(64비트라면 8)

    return 0;
}

배열을 이용해서 10진수를 2진수로 변환하기

10진수를 몫이 0이 될 때까지 2로 계속 나눈 다음 나머지를 역순으로 읽으면 2진수가 된다.

#include <stdio.h>

int main()
{
    int decimal = 13; // 2진수로 바꿀 값
    int binary[20] = { 0, }; // 20비트의 이진수 

    int position = 0; // 2진수 값이 들어갈 위치
    while (1)
    {
        binary[position] = decimal % 2;    // 2로 나누었을 때 나머지를 배열에 저장
        decimal = decimal / 2;             // 2로 나눈 몫을 저장

        position++;    // 자릿수 변경

        if (decimal == 0)    // 몫이 0이 되면 반복을 끝냄
            break;
    }

    // 배열의 요소를 역순으로 출력
    for (int i = position - 1; i >= 0; i--)
    {
        printf("%d", binary[i]);
    }

    printf("\n");

    return 0;
}
반응형