본문 바로가기
c언어

c언어(포인터와 배열)_2024-05-16

by 앵보몬 2024. 5. 16.
728x90
반응형
#include <stdio.h>

int main(){
    int i, n;
    printf("단을 입력하세요. : ");
    scanf("%d", &n);

    for (i=1; i <= 9; i++)
    {
        printf(" %d * %d = %2d\n", n, i, n*i);
    }

    return 0;
}
9 * 1 =  9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

 

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

int main()
{
    int num1 = 20;
    int *numPtr1;

    numPtr1 = &num1;
    int *numPtr2;

    numPtr2 = malloc(sizeof(int));

    printf("%p\n", numPtr1);
                             

    printf("%p\n", numPtr2);
                           

    free(numPtr2);

    return 0;
}
000000000061FE0C
0000000000961400

 

#include <stdio.h>

int main(){

    int num1;

    printf("정수 입력하세요. : ");
    scanf("%d", &num1);

    if (num1 % 2 ==0)
    {
        printf("짝수이면 odd\n");
    }
    else if (num1 % 2 == 1)
    {
        printf("홀수이면 even\n");
    }

    printf("당신이 입력한 수는 %d\n", num1);
    printf("입력완료\n");

}
정수 입력하세요. : 5
홀수이면 even
당신이 입력한 수는 5
입력완료

 

#include <stdio.h>

int main(){


    int kok[5] = {50, 80, 120, 40, 90};
    int eng[5] = {80, 98, 85, 46, 85};
    int sum = 0;
    float avg = 0;
    int max, min;



    for (int i=0; i < 5; i++)
    {
        sum = kok[i] + eng[i];
        avg = (float)sum / 2;
        printf("학생 %d : 합계 = %d, 평균 = %.2f\n", i+1, sum, avg);
    }

    max = kok[0];
    min = kok[0];

    for (int i=1; i < 5; i++)
    {
        if (kok[i] > max)
            max = kok[i];
        if (kok[i] < min)
            min = kok[i];
    }
        printf("\n 국어점수 최고점수 : %d, 최저점수 %d\n", max, min);


    max = kok[0];
    min = kok[0];

        for (int i=1; i < 5; i++)
    {
        if (eng[i] > max)
            max = eng[i];
        if (eng[i] < min)
            min = eng[i];
    }
        printf("\n 영어점수 최고점수 : %d, 최저점수 %d\n", max, min);

    return 0;

}
학생 1 : 합계 = 130, 평균 = 65.00
학생 2 : 합계 = 178, 평균 = 89.00
학생 3 : 합계 = 205, 평균 = 102.50
학생 4 : 합계 = 86, 평균 = 43.00
학생 5 : 합계 = 175, 평균 = 87.50

국어점수 최고점수 : 120, 최저점수 40
영어점수 최고점수 : 98, 최저점수 46

 

#include <stdio.h>

int main(){

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

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

   return 0;
}
11
77
99
132

 

#include <stdio.h>

int main(){
    int array[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    for (int i=0; i<2; i++){
        for(int j=0; j<3; j++){      
          printf("%d", array[i][j]);

        }
        printf("\n");
    }
   
    return 0;
}
123
456

 

배열

배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태입니다. [ ]에 크기를 지정하여 선언하며 선언된 배열에서 [ ]사이에 인덱스를 지정하여 요소에 접근합니다. 특히 배열의 인덱스는 0부터 시작합니다.

자료형 배열이름[크기];    // 배열 선언하기
자료형 배열이름[크기] = { 값, 값, 값 };    // 배열을 선언하면서 값을 초기화하기

배열[인덱스];         // 배열의 요소에 접근
배열[0];             // 배열의 인덱스는 0부터 시작하므로 첫 번째 요소

배열[인덱스] = 값;    // 배열의 요소에 값 저장

자료형 *포인터;       // 배열을 넣을 수 있는 포인터

 

2차원 배열

2차원 배열은 가로x세로의 평면 구조로 이루어져 있습니다. 2차원 배열을 선언할 때는 [ ]를 두 번 사용하여 선언하며 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정합니다. 일반적으로 2차원 공간은 가로x세로로 표기하지만 배열로 만들 때는 세로x가로로 표기합니다.

자료형 배열이름[세로크기][가로크기];    // 2차원 배열 선언하기
자료형 배열이름[세로크기][가로크기] = { { 값, 값, 값 }, {값, 값, 값} };   // 2차원 배열을 선언하면서 
                                                                      // 값 초기화하기

배열[세로인덱스][가로인덱스];          // 2차원 배열의 요소에 접근
배열[세로인덱스][가로인덱스] = 값;     // 2차원 배열의 요소에 값 저장

자료형 (*포인터이름)[가로크기];        // 2차원 배열을 넣을 수 있는 포인터

 

3차원 배열

3차원 배열은 높이x세로x가로 형태로 이루어져 있습니다. 3차원 배열은 [ ]에 높이, 세로 크기, 가로 크기를 지정하여 선언합니다. 3차원 공간은 가로x세로x높이로 표기하지만 배열로 만들 때는 높이x세로x가로로 표기합니다.

자료형 배열이름[높이][세로크기][가로크기];      // 3차원 배열 선언하기

자료형 배열이름[높이][세로크기][가로크기] = {   // 2차원 배열을 선언하면서 값 초기화하기
    {
        { 값, 값, 값 },
        { 값, 값, 값 }
    }, 
    {
        { 값, 값, 값 },
        { 값, 값, 값 }
    }
};

배열[높이인덱스][세로인덱스][가로인덱스];         // 3차원 배열의 요소에 접근
배열[높이인덱스][세로인덱스][가로인덱스] = 값;    // 3차원 배열의 요소에 값 저장

자료형 (*포인터이름)[세로크기][가로크기];         // 3차원 배열을 넣을 수 있는 포인터

 

배열의 크기 구하기

배열의 크기를 구할 때는 sizeof 연산자를 사용합니다.

sizeof(배열);                       // 배열이 차지하는 전체 공간 구하기
sizeof(배열) / sizeof(자료형));      // 배열의 크기 구하기
                                    // 배열이 차지하는 전체 공간을 요소의 크기로 나눠줌
                                    // 또는 sizeof(배열) / sizeof(배열[0]);

sizeof(배열) / sizeof(배열[0]);      // 2차원 배열의 세로 크기를 구하기
                                    // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌
sizeof(배열[0]) / sizeof(자료형);    // 2차원 배열의 가로 크기 구하기
                                    // 가로 한 줄의 크기를 요소의 크기로 나눠줌
                                    // 또는 sizeof(배열[0]) / sizeof(배열[0][0]);

sizeof(배열) / sizeof(배열[0]);          // 3차원 배열의 높이 구하기
                                        // 배열이 차지하는 전체 공간을 면의 크기로 나눠줌
sizeof(배열[0]) / sizeof(배열[0][0]);    // 3차원 배열의 세로 크기 구하기
                                        // 한 면의 크기를 가로 한 줄의 크기로 나눠줌
sizeof(배열[0][0]) / sizeof(자료형);     // 3차원 배열의 가로 크기 구하기
                                        // 가로 한 줄의 크기를 요소의 크기로 나눠줌
                                        // 또는 sizeof(배열[0][0]) / sizeof(배열[0][0][0]);

 

포인터를 배열처럼 사용하기

포인터에 메모리를 할당한 뒤 [ ]에 인덱스를 지정하면 배열처럼 사용할 수 있습니다.

자료형 *포인터이름 = malloc(sizeof(자료형) * 크기);    // 포인터를 배열처럼 사용할 수 있음

포인터[인덱스]    // 포인터 사용

free(포인터);      // 메모리 해제

포인터를 2차원 배열처럼 사용하려면 이중 포인터를 선언한 뒤 세로 공간 메모리를 할당하고, 반복문으로 가로 공간 메모리를 할당하면 됩니다. 해제할 때는 가로 → 세로 순서입니다.

// 포인터를 2차원 배열처럼 사용할 수 있음
자료형 **포인터이름 = malloc(sizeof(자료형 *) * 세로크기);    // 배열의 세로 공간 메모리 할당

for (int i = 0; i < 세로크기; i++)                   // 세로 크기만큼 반복
{
    포인터[i] = malloc(sizeof(자료형) * 가로크기);    // 배열의 가로 공간 메모리 할당
}

포인터[세로인덱스][가로인덱스];    // 포인터 사용

// 포인터 해제
for (int i = 0; i < 세로 크기; i++)    // 세로 크기만큼 반복
{
    free(포인터[i]);                   // 가로 공간 메모리 해제
}

free(포인터);    // 세로 공간 메모리 해제

2차원 배열처럼 사용하는 이중 포인터를 그림으로 나타내면 다음과 같은 모양이 됩니다.

▼ 그림 2차원 배열처럼 사용하는 이중 포인터 

포인터를 3차원 배열처럼 사용하려면 삼중 포인터를 선언한 뒤 먼저 면 공간 메모리를 할당합니다. 반복문으로 세로 공간 메모리를 할당하면서 다시 반복문으로 가로 공간 메모리를 할당하면 됩니다. 해제할 때는 가로 → 세로 → 면 순서입니다.

// 포인터를 3차원 배열처럼 사용할 수 있음
자료형 ***포인터이름 = malloc(sizeof(자료형 **) * 높이);    // 배열의 면 공간 메모리 할당

for (int depth = 0; depth < 높이; depth++)
{
    포인터[depth] = malloc(sizeof(자료형 *) * 세로크기);    // 배열의 세로 공간 메모리 할당

    for (int row = 0; row < 세로크기; row++)                      // 세로 크기만큼 반복
    {
        포인터[depth][row] = malloc(sizeof(자료형) * 가로크기);    // 배열의 가로 공간 메모리 할당
    }
}

포인터[높이인덱스][세로인덱스][가로인덱스];    // 포인터 사용

// 포인터 해제
for (int depth = 0; depth < 높이; depth++)    // 높이만큼 반복
{
    for (int row = 0; row < 세로크기; row++)    // 세로 크기만큼 반복
    {
        free(포인터[depth][row]);               // 가로 공간 메모리 해제
    }

    free(포인터[depth]);    // 세로 공간 메모리 해제
}

free(포인터);    // 면 공간 메모리 해제

3차원 배열처럼 사용하는 삼중 포인터를 그림으로 표현하면 다음과 같은 모양이 됩니다.

▼ 그림 3차원 배열처럼 사용하는 삼중 포인터 

https://dojang.io/mod/page/view.php?id=673

728x90
반응형