스터디 그룹/ProjectH4C

ProjectH4C 2개월 3주차 과제 (UNIT36, 37, 38)

📖UNIT36

📒배열을 선언하고 요소에 접근하기

먼저, 배열이 왜 필요한 지에 관한 설명은 생략하겠다.

 

배열의 기본적인 선언과 초기화는 자료형 배열이름[크기] = {값1, 값2, 값3 ..}; 이렇게 진행된다.

 

int array[5] = {10, 20, 30, 40, 50};

만약 배열이 이렇게 선언과 초기화가 된다면, array[0] = 10, array[4] = 50 이 될 것이다.

즉 인덱싱은 0번부터 진행된다.

 

 

만약 원소의 갯수는 정했지만, 배열의 크기를 계산하기 힘들다면

int array[] = {10, 20, 30, 40, 50};

이렇게 진행해주면 된디.

 


📒배열을 모두 0으로 초기화하기.

그런 배열의 모든 값을 0으로 초기화해주고 싶다면

int arr[10] = {0, }

이렇게 해주면 된다. arr의 모든 원소들이 0이 된다.


📒배열의 크기 구하기

그럼 이런 배열의 크기는 어떻게 구해야 할까.

 

sizeof(arr)

이렇게 해준다면 이미 하나의 정수값이 되었다.

만약 요소의 갯수를 구하고 싶다면

sizeof(arr)/sizeof(int)

이렇게 해주면 될 것이다.

 


📒요소를 다 출력하기

반복문에서 변수 i를 0부터 sizeof(arr) / sizeof(int) 가 되기 전까지 반복을 진행해주면 된다.

 

#include <stdio.h>

int main(void){
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    for(int i = 0; i < sizeof(arr) / sizeof(int); i++){
        printf("%d\n", arr[i]);
    }
    return 0;
}

 

이렇게 말이다 !


📒요소의 합 구하기

위의 출력하는 과정에서 출력되는 요소들의 합을 다 더해주면 된다.

#include <stdio.h>

int main(void){
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum = 0;
    for(int i = 0; i < sizeof(arr) / sizeof(int); i++){
        printf("%d\n", arr[i]);
        sum += arr[i];
    }
    return 0;
}

📒배열을 포인터에 넣기

배열은 그 자체로 포인터의 성질을 띈다.

 

그래서 일반적인 변수는 int *numPtr = &num1; 과 같이 사용하였다면

배열은 int *arrPtr = arr; 로 지정해주어야 한다.

 

이렇게 된다면 역참조를 진행할 때 arrPtr[3] 과 같이 사용할 수 있다. (배열 자체도 마찬가지이다.)

 


📖UNIT37

📒이차원 배열 사용하기

이차원배열은 아까 우리가 만든 그 일차원 배열을 가로 세로로 만든 것이다.

 

먼저 선언하는 방법은 넘어가고 바로 초기화를 진행해보자.

 

만약 배열의 모든 원소를 0으로 초기화하려면 어떻게 해야 할까

#incldue <stdio.h>

int main(){
    int numarr[3][4] = {0, };
    
    return 0;
}

이렇게 해주면 배열의 모든 원소들은 한 번에 0으로 초기화된다.


📒이차원 배열의 크기 구하기

이차원 배열의 크기라는 말이 뭔가 어색하다.

 

먼저 numarr[4][3]을 초기화했다고 생각해보자.

 

이 상태에서 sizeof(numarr)을 하게 되면 48이 반환된다.

그 이유는 이미 저 배열 안에는 12개의 요소들이 존재하고, 각 요소들의 크기는 4byte이기 때문이다.

 

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };

    printf("%d\n", sizeof(numArr));    

    int col = sizeof(numArr[0]) / sizeof(int);    
                                                  

    int row = sizeof(numArr) / sizeof(numArr[0]); 
                                    

    printf("%d\n", col);    // 4
    printf("%d\n", row);    // 3

    return 0;
}

이 코드를 가지고 분석해보자.

 

먼저 numArr은 행의 크기가 4, 열의 크기가 3이다.

요소는 총 12개이므로 첫번째 printf에서 48이 출력될 것이다.

 

 

두 번째 printf를 보자 col이라는 변수에 numArr의 첫 번째 행의 크기를 계산하고 int의 크기로 나눈 값을 집어넣었다.

즉 한 행에 속하는 원소들의 갯수를 집어넣은 것이다.

 

세 번째 printf도 약간 비슷하게 전체 numArr의 크기를 구하고, 한 행의 크기로 나누었다. 즉 열의 갯수를 구한 것이다.

 


📖UNIT38

📒포인터와 배열 응용하기

#define _CRT_SECURE_NO_WARNING
#include <stdio.h>

int main()
{
    int size;

    scanf("%d", &size);  // 배열의 크기를 입력받음

    int numArr[size];    // GCC에서는 사용 가능, Visual Studio 2015에서는 컴파일 에러

    return 0;
}

이렇게 입력을 받아서 그만큼 배열을 만드는 방법은 VS2015에서 에러를 발생시킨다고 한다.

 

GCC, Clang에서는 지원한다는 것을 보면 지원을 할 지도 ...?


📒포인터에 할당된 메모리를 배열처럼

위의 상황에 대한 해답을 찾기 위해 포인터를 사용하자.

음 그러니까 malloc을 할 때, 변수 하나만 지정해주는 것이 아니라 그 크기를 엄청 많이 해주면 될 것 같다.

 

#include <stdio.h>
#include <stdlib.h>    

int main()
{
    int *numPtr = malloc(sizeof(int) * 10);    

    numPtr[0] = 10;    
    numPtr[9] = 20;    // 배열처럼 인덱스로 접근하여 값 할당

    printf("%d\n", numPtr[0]);    // 배열처럼 인덱스로 접근하여 값 출력
    printf("%d\n", numPtr[9]);    // 배열처럼 인덱스로 접근하여 값 출력

    free(numPtr);    // 동적으로 할당한 메모리 해제

    return 0;
}

결국 numPtr은 하나의 배열이 된 것이다. sizeof(int) * 10의 코드 전에 값을 입력받아 10 대신 사용할 수도 있다.

그럼 사용자가 입력한 크기 만큼의 배열이 선언되겠지.


📒포인터에 할당된 메모리를 2차원 배열로

먼저, 세로크기의 메모리를 할당해야 한다. (세로를 할당하게 되면 인덱싱을 통해서 각 요소들에 또 배열을 추가할 수 있기때문)

 

이렇게 세로크기의 메모리를 할당하게 된다면 반복문을 통해서 각 열마다 행을 추가시켜주면 된다.

처음 세로크기의 메모리를 선언할 때는 이중 포인터로 선언해주어야 한다.

그래야 그 안에 또 포인터를 만들 수 있으니.

 

#include <stdio.h>
#include <stdlib.h>    

int main()
{
    int **m = malloc(sizeof(int *) * 3);   
                                           

    for (int i = 0; i < 3; i++)            
    {
        m[i] = malloc(sizeof(int) * 4);    
                                           
    }

    m[0][0] = 1;    
    m[2][0] = 5;    
    m[2][3] = 2;    

    printf("%d\n", m[0][0]);    
    printf("%d\n", m[2][0]);    
    printf("%d\n", m[2][3]);    

    for (int i = 0; i < 3; i++)    
    {
        free(m[i]);                
    }

    free(m);    // 2차원 배열의 세로 공간 메모리 해제

    return 0;
}

이렇게 마지막에 free까지 해주면 완벽할 것이다. 

만약 입력받은 값으로 진행하고 싶다면 malloc 내에서 * 3, * 4를 입력받은 두 값으로 진행해주면 된다.