Hayden's Archive
[C언어] 메모리 관련 코드 본문
메모리를 배우면서 포인터를 알게 되었다. 자바와 파이썬을 배울 때는 포인터를 몰랐고 알 필요도 없었는데 가장 원시적인 언어인 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;
}
출력 결과)