728x90
커뮤니티_모각코 (모여서, 각자, 코딩) 활동을 하면서 배운 내용을 되새기며 쓴 글입니다.
코딩을 배우고 싶다면 코뮤니티 활동을 적극 추천합니다.
https://cafe.naver.com/codeuniv
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 |
댓글