[c 언어] 다차원 배열

    다차원 포인터

     

    떨어져 있는 메모리(값)들을 포인터를 이용해서 배열처럼 사용 할 수 있다.

     

    사용하는 이유

    • 일괄처리 가능하다.
    • 관리하기 쉽다.
    • 코드가 간결해진다.

     

     

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

    정답은 아래에

    반응형

    댓글

    Designed by JB FACTORY