Hayden's Archive

[C언어] 메모리 관련 코드 본문

Study/ETC

[C언어] 메모리 관련 코드

_hayden 2020. 8. 14. 07:55

메모리를 배우면서 포인터를 알게 되었다. 자바와 파이썬을 배울 때는 포인터를 몰랐고 알 필요도 없었는데 가장 원시적인 언어인 C에서는 중요하게 다뤄지는 개념이다.

그런고로 포인터를 활용해서 배열의 요소를 불러오는 코드를 작성해봤다.

 

#include <stdio.h>

//테스트 배열 1
int arr[6][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15},
                        {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25}, {26, 27, 28, 29, 30}};
//테스트 배열 2
int arr2[7][6] = {{1, 2, 3, 4, 5, 0}, {6, 7, 8, 9, 10, 0}, {11, 12, 13, 14, 15, 0},
                        {16, 17, 18, 19, 20, 0}, {21, 22, 23, 24, 25, 0}, {26, 27, 28, 29, 30, 0}, {31, 32, 33, 34, 35, 0}};
                    
void printArr(int n, int m, int *addr); // n × m 차원과 배열의 포인터 변수를 매개변수로 받는 함수 printArr 선언

int main()
{
    //arr[6][5] 테스트
    int total = sizeof(arr)/sizeof(int); //전체 요소의 개수
    int m = sizeof(arr[0])/sizeof(int); //0번째 요소 안에 있는 요소의 개수
    int n = total/m; //요소의 개수
    printf("%d x %d 배열(총 %d개)\n", n, m, total);
    int *p = &arr[0][0]; //포인터 변수 p에 배열의 주소값 할당
    printArr(n, m, p);

    //int[7][6] 테스트
    total = sizeof(arr2)/sizeof(int); //전체 요소의 개수
    m = sizeof(arr2[0])/sizeof(int); //0번째 요소 안에 있는 요소의 개수
    n = total/m; //요소의 개수
    printf("%d x %d 배열(총 %d개)\n", n, m, total);
    p = &arr2[0][0]; //포인터 변수 p에 배열의 주소값 할당
    printArr(n, m, p);
}

void printArr(int n, int m, int *addr)
{
    for(int i=n-1; i>=0; i--)
    {
        for(int j=0; j<m; j++)
        {
            /* 인자값으로 받은 addr은 2차원 배열 0행 0열의 값의 주소값을 가진다.
            이 주소값에 j씩 더하면 같은 0행에서 j씩 뒤에 있는 요소의 주소값을 가지게 된다.
            한 행당 m개의 열이 있으므로 i*m을 더하면 같은 m열에서 i행에 있는 요소의 주소값을 가지게 된다.*/
            printf( "%d\t", *( (addr+j) + (i*m) ) );
        }
        printf("\n");
    }
}

출력 결과)

 

 

 

#include <stdio.h>

void sort(int n, int arr[])
{
    int temp; //임시저장 변수 선언
    int *p = &arr[0];
    for(int i=0; i<n; i++)
    {
        for(int j=1; j<n; j++)
        {
            int *num1 = p+j-1; //포인터 변수 num1에 j-1번째 요소의 주소를 저장
            int *num2 = p+j; //포인터 변수 num2에 j번째 요소의 주소를 저장
            if(*num1 > *num2)
            {//앞수가 뒷수보다 더 클 경우 교환
                temp = *num1;
                *num1 = *num2;
                *num2 = temp;
            }//if문
        }//for문(int j)
    }//for문(int i)
}

int main() 
{ 
    int n = 7; 
    int arr[7] = { 0, 25, 10, 17, 6, 12, 9 }; 

    sort(n, arr); //버블정렬

    /* 버블정렬된 배열 출력 */
    for(int i=0; i<n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0; 
}

 출력 결과)