본문 바로가기
  • 시간(時間)을 아끼는 방법은 시간을 낭비하지 않는것


C_ language/C언어 심화_모각코

C언어_심화_2차원 배열과 이중포인터

by pk7912 2022. 5. 26.
728x90

커뮤니티_모각코 (모여서, 각자, 코딩) 활동을 하면서 배운 내용을 되새기며 쓴 글입니다.

코딩을 배우고 싶다면 코뮤니티 활동을 적극 추천합니다.

https://cafe.naver.com/codeuniv 

 

코딩 커뮤니티 - 코뮤니티 [파이썬/... : 네이버 카페

코뮤니티 [코딩공부/독학/스터디/대외활동] : python, C언어, java, 자바스크립트, HTML, CSS, 웹/앱개발

cafe.naver.com

 


1차원 배열 포인터 할당 && 2차원 배열 포인터 할당 비교

* 2차원 배열과 이중포인터는 밀접한 관련이 있습니다.

 

1차원 배열 포인터 할당

#pragma warning(disable : 4996)
#include <stdio.h>

int main()
{	
	int arr[5] = { 1, 2, 3, 4, 5}
    int * ptr = arr;

 

2차원 배열 포인터 할당

#pragma warning(disable : 4996)
#include <stdio.h>

int main()
{
	int arr[3][2] = {(1, 2), (3, 4), (5, 6)};
                     
    int (*ptr)[2] = arr;

 

2차원 배열을 이중 포인터에 할당하기 위해서는 가로 크기(열, column)가 지정되어 있어야 합니다.

 


포인터 연산

arr[1][1] == *(*(ptr + 1) + 1)
#pragma warning(disable : 4996)
#include <stdio.h>

int main() {

    int arr[3][2] = {
            {1, 2},
            {3, 4},
            {5, 6},
    };

    int(*pointer)[2] = arr;

    printf("%d\n", **pointer);
    printf("%d\n", *(*pointer + 1));

    printf("%d\n", *(*(pointer + 1) + 0)); 
    printf("%d\n", *(*(pointer + 1) + 1));

    printf("%d\n", *(*(pointer + 2) + 0)); 
    printf("%d\n", *(*(pointer + 2) + 1));


    //assert(&arr[0][0] == *pointer);
    //assert(&arr[0][1] == *pointer + 1);

    //assert(&arr[1][0] == *(pointer + 1));
    //assert(&arr[1][1] == *(pointer + 1) + 1);

    //assert(&arr[2][0] == *(pointer + 2));
    //assert(&arr[2][1] == *(pointer + 2) + 1);

    return 0;
}

 

 

실행시 -->

 

 

 

 

 


 

행렬의 곱셈

 

행렬의 곱셈은 크기가 맞는 경우만 가능하다. 크기가 맞다는 것은 앞 행렬의 열의 수와 뒤 행렬의 행의 수가 같다는 거다.

 

(앞 행렬의 행의 수) x (뒤 행렬의 열의 수) 

 

 


 

practice

 

3X3 행렬 2개를 선언하고, 값을 입력받은 뒤 두 행렬의 곱을 구해 보기.

입력값

[행렬 A]
1
2
3
4
5
6
7
8
9

[행렬 B]
11
12
13
14
15
16
17
18
19

 

#pragma warning(disable : 4996)
#include <stdio.h>

int main()
{
	int A[3][3];
	int B[3][3];
	int S[3][3] = { 0. };

	int(*AA)[3] = A;
	int(*BB)[3] = B;

	printf("[행렬 A]\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &A[i][j]);
		}

	}
	printf("\n\n");

	printf("[행렬 B]\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &B[i][j]);
		}

	}
	printf("\n\n");

	printf("[행렬 A]\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", A[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");

	printf("[행렬 B]\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", B[i][j]);
		}
		printf("\n");
	}
	printf("\n\n");

	for (int R = 0; R < 3; R++)
	{
		for (int C = 0; C < 3; C++)
		{
			S[R][C] = 0;
			for (int K = 0; K < 3; K++)
			{
				S[R][C] = S[R][C] + (A[R][K] * B[K][C]);
			}
		}
	}

	printf("[행렬 곱]\n");
	for (int R = 0; R < 3; R++)
	{
		for (int C = 0; C < 3; C++)
		{
			printf("%d ", S[R][C]);
		}
		printf("\n");
	}

	return 0;
}

실행값

 

 


 

마무리

이건 뭐.. 행과 열부터 헷갈리더니 기억이 하나도 안 났다.

행열의 곱은 학교 다닐 때 배운 거긴 한데... 

이중 포인터와 행렬은 좀 더 이해하고 넘어가야 할 것 같다. 

전에 파이썬으로 주식 관련 코드 짤 때 Numpy 썼었는데,

행열로 표현되고 연산했던 게 기억난다. c언어로 주식 관련 코드 짤 일은 없을 거 같긴 한데...

아직도 쓰임새를 잘 몰라서...

 

흠.. c언어가 안 쓰인 곳이 없다던데  행열과 이중 포인터는 어떻게 쓰일지.... 기대도 되고 걱정도 되고...

 

 

 

 

 

 

'C_ language > C언어 심화_모각코' 카테고리의 다른 글

C언어_심화_동적 메모리 할당  (0) 2022.06.17
C언어_심화_함수 포인터  (0) 2022.06.09
C언어_심화_이중 포인터  (0) 2022.05.10
C언어_심화_2차원 배열  (0) 2022.05.06
C언어_심화_구조체  (0) 2022.05.06

댓글