2차원 배열 예제
간단하게 malloc 함수를 이용해서 2차원 포인터 구조를 만들어보자.
#include <stdio.h>
#include <malloc.h>
int main()
{
int** arr;//2차원 포인터 선언 arr -> *arr -> **arr로 진행한다.
arr = (int**)malloc(sizeof(int*));//1차원 포인터 역할을 하는 malloc를 사용하여 메모리를 만든다.
//애가 가르키는 것은 2차원 배열(기준) => 1차원 배열 주소를 받는 것.
*arr = (int*)malloc(sizeof(int)); //마지막 일반 변수에 메모리 할당
**arr = 10; //**arr은 일반 변수의 주소
printf("**arr : %d\n", **arr);
free(*arr);
free(arr);
}
자세한 설명은 주석 참조.
#include <stdio.h>
#include <malloc.h>
int Myway(int** temp)
//2개의 포인터 구조가 생성된다. 2차원 -> 1차원 -> 일반 변수
//int** temp를 선언함으로써, 2차원이 -> 1차원(num)의 주소를 받는다.
{
*temp = (int *)malloc(8); //*temp(일반 변수)에 8바이트 메모리 할당.
}
int main()
{
int* num;
Myway(&num);
*num = 5;
free(num);
}
이 문제를 통해서 2차원 포인터와 함수 관계에 대해서 연습 할 수 있다.
MYway 매개변수를 int** temp로 선언함으로써, &num값의 주소를 받을 수 있다.
만약에 MYway(&num) 값을 넘기지 않고, 매개변수를 2차원 포인터로 설정하지 않았으면, 오류가 발생한다.
main 함수에 선언한 지역 변수의 이름은 이용할 수 없고, 주소는 사용할 수 있다는 점을 기억.
마지막으로 free(num)를 마지막에 한 이유는 위에 함수에서 할당된 동시에 free로 해제하면, 메모리가 바로 해제된다.
추가적으로 메모리를 크기를 적을 때는 상수가 아닌 변수를 사용하는 것이 좋다.
int n;
short **arr;
scanf_s("%d", &n);
arr = (short**)malloc(sizeof(short*) * n))
이렇게 사용하면 short* 형식의 1차원 포인터를 n개 할당한다.
2차원 배열과 포인터 예제
문제3. 2차원 배열로 연령별 팔굽혀펴기 횟수 관리하기
#include <stdio.h>
int main()
{
unsigned char limit[3] = { 2, 3, 4}; // 20대, 30대,40대, 50대를 표현 함
unsigned char count[3][4]; //사용자의 값을 저장하려고 나타냄.
int age, member, temp, sum;
//중요코드1
for (int age = 0; age < 3; age++)
{
printf("\n%d0대 팔굽혀펴기 횟수 : \n", age + 2);
for (member = 0; member < limit[age]; member++)
{
printf("%dth : ", member + 1);
scanf_s("%d", &temp);
count[age][member] = (unsigned char)temp; // 각 2차원 배열을 돌면서 temp 값을 대입한다.
}
}
printf("\n\n연령별 평균 팔굽혀펴기 \n");
//중요코드2
for (age = 0; age < 3; age++)
{
sum = 0;
printf("%d0대", age + 2);
for (member = 0; member < limit[age]; member++)
{
sum = sum + count[age][member]; //temp 값이 나오게 된다. count[age][member] == temp
}
printf("%5.2f\n", (double)sum / limit[age]);
}
}
-> + 연령층에 포함된 인원수가 변한다면? 10대부터 시작
#include <stdio.h>
#include <malloc.h>
int main()
{
unsigned char People[4]; //사용자로부터 값을 받는다.//값은 마지막에 temp가 넣어준다.
unsigned char* arr[4];
int sum = 0, member = 0, age = 0, temp;
for (age = 0; age < 4; age++)
{
printf("%d0대 연령인 팔굽혀펴기 횟수\n", age+1);
printf("이 연령대는 몇 명 입니까? : ");
scanf_s("%d", &temp);
People[age] = (unsigned)temp; // 앞 부분은 배열이 선언되어 있었지만, 이 부분은 사용자로부터 값을 입력받는다.
//콘솔창에 10대가 몇명인지 20대가 몇명인지 기입해주는 역할
arr[age] = (unsigned char*)malloc(People[age]); // 위에서 10대 5명 20대 -7명
// 포인터 arr[0] => 10대의 5명의 배열을 가르키고
// 포인터 arr[1] => 20대의 7명의 배열을 가르킨다.
for (member = 0; member < People[age]; member++)
{
printf("%dth : ", member + 1);
scanf_s("%d", &temp);
*(arr[age] + member) = temp;
}
}
printf("\n\n 연령별 평균 팔굽혀펴기 일으키기 횟수 \n");
for (age = 0; age < 4; age++)
{
printf("%d0대 : ", age + 2);
for (member = 0; member < People[age]; member++)
{
sum = sum + *(arr[age] + member);
}
printf("%5.2f\n", (double)sum / People[age]);
free(arr[age]);
}
}
이와 같이 나온다.
=> 연령층이 확대된다면?
#include <stdio.h>
#include <malloc.h>
int main()
{
unsigned char* People; //연령별 인원수를 저장할 포인터
unsigned char** arr; // 연령별 윗몸 일으키기 횟수를 저장하는 포인터
int age, age_step, member, temp, sum = 0;
printf("10대부터 시작해서 연령층이 몇 개 인가요? > \n");
scanf_s("%d", &age_step); // 사용자로부터 age_step값을 받는다.
People = (unsigned char*)malloc(age_step); //받은 age_step값으로 할당한다.
arr = (unsigned char**)malloc(sizeof(unsigned char*) * age_step); // 2차원 포인터를 생성한 뒤, 1차원 포인터 저장공간에 메모리를 할당하고
//이전에 *arr[3] 같은 역할이다. 배열에서 *(p+0) / *(p+1) / *(p+2) 3가지 경우로 할당됐다.
//*(p+0)이 ----> 10대 포인터
//*(p+1)이 ----> 20대 포인터
for (age = 0; age < age_step; age++)
{
printf("\n%d0대 연령의 팔굽혀펴기 횟수 \n", age + 1);
printf("이 연령대는 몇명입니까 : \n");
scanf_s("%d", &temp);
*(People + age) = (unsigned char)temp;
*(arr + age) = (unsigned char*)malloc(*(People + age)); //여기서 인원 수 만큼 동적 메모리를 할당한다.
for (member = 0; member < *(People + age); member++)
{
printf("%dth\n", member + 1);
scanf_s("%d", &temp);
*(*(arr + age) + member) = (unsigned char)temp;
}
}
printf("\n\n연령별 평균 팔굽혀펴기 개수 \n");
for (age = 0; age < age_step; age++)
{
printf("%d0대 : ", age + 1);
for (member = 0; member < *(People + age); member++)
{
sum = sum + *(*(arr + age) + member);
}
printf("%5.2f\n", (double)sum / *(People + age));
free(*(arr + age));
}
free(arr);
free(People);
}