[c 언어] 다차원 배열
- 카테고리 없음
- 2020. 11. 26.
다차원 포인터
떨어져 있는 메모리(값)들을 포인터를 이용해서 배열처럼 사용 할 수 있다.
사용하는 이유
- 일괄처리 가능하다.
- 관리하기 쉽다.
- 코드가 간결해진다.
#include <stdio.h>
int main() {
int* p[3]; // 1. array[3] 2. int * 3개
// pointer array
//int(*p)[3];
//int** p;
int a = 3;
int b = 4;
int c = 5;
int i;
p[0] = &a;
p[1] = &b;
p[2] = &c;
for (i = 0; i < 3; i++)
{
printf("%d \n", *p[i]);
}
}
포인터 배열을 통해서 각 변수들을 쉽게 관리 할 수 있게 된다.
#include<stdio.h>
int main() {
int(*p)[3]; // 한 행당 3개의 요소를 가지고 있는
// 배열을 가르키는 포인터
// 요소는 int
// ★★★ 포인터 매우 중요 ★★★
// 만약 int a[3][4]가 있다고 가정했을 때.
// a+1을 할 경우 a[1][0]을 가르킨다.
// 그러나 위에 있는 int (*p)[3]을 사용했을 경우
// p+1을 할 경우 p[0][3]을 가르킨다.
int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
int* p1;
int i, j;
p1 = a[0]; // *a, &a[0][0]
p = a;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d\t%d\t%d\n", a[i][j], *(a[i] + j), *(*(a + i) + j));
printf("%d\t%d\t%d\n", p[i][j], *(p[i] + j), *(*(a + i) + j));
}
}
}
이중 for문에서도 사용 할 수 있게 되는데, 2차원 배열일 경우, 열의 갯수를 기준으로 포인터 갯수를 정한다.
여기서 출력 할 때, for문 활용방법을 참고하여 결과가 어떻게 도출 되는지를 파악하는 것이 중요하다.
코드 응용하기
#include <stdio.h>
int main() {
char name[3][10]; //이름
int score[3][4] = { 0 };
float avg[3] = { 0.f };
int i, j;
//포인터 만들기
char (*p_name)[10] = name;
int (*p_score)[4] = score;
float* p_avg = avg;
for (i = 0; i < 3; i++)
{
//이름 입력하기
printf("이름 입력하기 : ");
scanf("%s", p_name+i);
printf("\n점수 입력하기\n");
for (j = 0; j < 3; j++) {
//점수 입력하기
switch (j)
{
case 0:
printf("국어 점수 : ");
break;
case 1:
printf("영어 점수 : ");
break;
case 2:
printf("수학 점수 : ");
break;
}
scanf("\n%d", *(p_score + i)+j);
*(*(p_score+i )+ 3) += *((*(p_score +i))+ j);
}
*(p_avg+i) = *(*(p_score + i) + 3) / 3.f;
}
printf("이름\t\t국어\t영어\t수학\t총점\t\t평균\n");
for (i = 0; i < 3; i++)
{
printf("%s\t\t", p_name+i);
for (j = 0; j < 4; j++)
{
printf("%d\t", *(*(p_score + i) + j));
}
printf("\t%f\n", *(p_avg+i));
}
return 0;
}
위 방법을 기준으로, 기존의 학생 코드를 다시 정렬을 하였다.
Pointer's Pointer (포인터가 가르키는 포인터)
int **pp;
a= 10;
*p = &a;
**pp = *p;
**pp : pp가 가르키고 있는 p가 가르키고 있는 1차원 포인터 주소의 값.
*pp : pp가 가르키고 있는 p가 갖고 있는 a의 주소값
#include<stdio.h>
int main()
{
int** pp; //1. * 2. int *
int* p;
int a = 10;
p = &a;
pp = &p;
printf("%d %d %d\n", a, *p, **pp);
//a의 주소
printf("%d %d %d\n", &a, p, *pp);
//p의 주소 , pp의 주소
printf("%d %d %d\n", &p, pp, &pp);
return 0;
}
**pp를 이용해서 값 출력 해보기
#include<stdio.h>
int main()
{
//1. 변수 선언
int a = 10;
int b = 20;
int c = 30;
int** pp;
int* p[3];
//2. pp이용 p[3] 선언
pp = &p;
//3. pp를 이용해서 a, b, c 선언
*pp = &a;
*(pp+1) = &b;
*(pp+2) = &c;
//4. pp를 이용해서 a, b, c 출력
printf("%d\n", **pp);
printf("%d\n", **(pp+1));
printf("%d\n", **(pp+2));
}
* 포인터 이용해서 3차열 배열 만들기
#include <stdio.h>
int main() {
char name[3][3][10]; //이름
int score[3][3][4] = { 0 };
float avg[3][3] = { 0.f };
int i, j, k;
//포인터 만들기
char(*p_name)[3][10] = name;
int(*p_score)[3][4] = score;
float(*p_avg)[3] = avg;
for (k = 0; k < 3; k++)
{
for (i = 0; i < 3; i++)
{
//이름 입력하기
printf("이름 입력하기 : ");
scanf("%s", *(p_name + k) + i);
printf("\n점수 입력하기\n");
for (j = 0; j < 3; j++) {
//점수 입력하기
switch (j)
{
case 0:
printf("국어 점수 : ");
break;
case 1:
printf("영어 점수 : ");
break;
case 2:
printf("수학 점수 : ");
break;
}
scanf("\n%d", *(*(p_score + k) + i) + j);
*(*(*(p_score + k) + i) + 3) += *((*(*(p_score + k) + i)) + j);
}
*(*(p_avg + k) + i) = *(*(*(p_score + k) + i) + 3) / 3.f;
}
}
printf("이름\t\t국어\t영어\t수학\t총점\t\t평균\n");
for (k = 0; k < 3; k++)
{
for (i = 0; i < 3; i++)
{
printf("%s\t\t", *(p_name + k) + i);
for (j = 0; j < 4; j++)
{
printf("%d\t", *(*(*(p_score + k) + i) + j));
}
printf("\t%f\n", *(*(p_avg + k) + i));
}
}
return 0;
}
★★★ 마무리 ★★★
#include<stdio.h>
int main()
{
int* ptr;
int n[] = { 5, 10, 22, 34, 36, 44 };
ptr = n;
printf("%d\n", *ptr++);
printf("%d\n", *ptr);
printf("%d\n", *ptr+1);
printf("%d\n", *ptr);
printf("%d\n", ++ * ptr);
printf("%d\n", *ptr);
printf("%d\n", *(ptr+1));
printf("%d\n", *ptr);
printf("%d\n", *ptr+=1);
printf("%d\n", *ptr);
printf("%d\n", *++ptr);
printf("%d\n", *ptr);
printf("%d\n", (*ptr)++);
printf("%d\n", *ptr);
return 0;
}
정답은 아래에
반응형