C언어 : 2차원 포인터 예제

지환·2022년 1월 24일
0

C언어

목록 보기
28/37
post-thumbnail

2차원 배열 예제

1.문제

간단하게 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);

}

자세한 설명은 주석 참조.

  • 포인트로 볼 부분은 동적으로 할당한 메모리를 해제하는 순서가 중요하다.
  • (*arr) 먼저 풀어준 이유는 주소값을 잃어 버리기 때문이다.
  • 세 번 째에 있는 포인터 주소 값을 해제하고 -> 진행해야된다.

<결과>

문제2. 2차원 포인터로 8바이트 동적 메모리를 할당하는 함수 만들기

#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차원 배열로 연령별 팔굽혀펴기 횟수 관리하기

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대부터 시작

1차원 포인터로 표현하자.

#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]);
	}


}

<결과>

이와 같이 나온다.
=> 연령층이 확대된다면?

2차원 포인터로 표현하자

#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);
}

<결과>

profile
아는만큼보인다.

0개의 댓글