inflearn logo
강의

Course

Instructor

Hong Jung-mo's C Programming: Learning by Doing

10.15 Pointer Compatibility

8:46~9:07

345

chang

9 asked

1

교수님께서 강의를 해 주실때

 

 

ar1[2][3]은 3개짜리이고, ar2[3][2]는 두개짜리라고 말씀해주셨습니다.

하지만 저는 반대로 ar1은 [3]개의 원소를 담은 배열이 '2개', ar2는 [2]개의 원소를 담은 배열이 '3개'라고 이해하였습니다.

array에서 두번째 차원의 원소의 수와 포인터의 사이즈가 같아야 하는건가요??

 

c

Answer 3

0

kangminchul

안녕하세요,

아까 제가 그림과 함께 답변해드린 내용을 정정합니다.

혼란을 드려 죄송합니다.

 

배열 포인터를 이차원 배열에 할당할 때 포인터 연산시 증감하는 크기를 기준으로 생각해보시면 됩니다.

배열 포인터는 포인터 연산 시 행의 길이만큼 증가합니다.

가령 아래 예제를 보시면, pa[0]는 0xffffec2c10a0

pa[1]는 0xffffec2c10a8

로 모두 int 두 개 크기(8바이트)만큼 증가한 것을 알 수 있습니다.

 

#include<stdio.h>

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

        int (*pa)[2];

        pa = ar2;

        printf("%p\n", pa);  // 0xffffec2c10a0
        printf("%p\n", pa+1);  // 0xffffec2c10a8

        return 0;
}

 

비슷한 예로 아래 코드의 경우 pa 포인터는 포인터 연산시 12바이트씩 증감합니다.

 

#include<stdio.h>

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

        int (*pa)[3];

        pa = ar2;

        printf("%p\n", pa); // 0xfffff824dcd0
        printf("%p\n", pa+1); // 0xfffff824dcdc


        return 0;
}

 

즉, 이차원 배열을 저장하는 포인터 배열은 

포인터 연산시 증가하는 크기 만큼 (다시 말해 가로 길이만큼) 

선언해주면 됩니다.

일전에 그려드렸던 그림보다는 아래 그림이 더 적절해 보입니다.

 

 

즉, int (*ptr)[2]는 "포인터 연산을 할 때 int 형 자료형 두 개만큼" 증감한다.

즉, int (*ptr)[3]는 "포인터 연산을 할 때 int 형 자료형 세 개만큼" 증감한다.

라고 생각하면 됩니다.

포인터 배열은 포인터 연산 증감크기만 맞춰준다면 아래와 같이도 연산할 수 있습니다.

 

#include<stdio.h>

int main()
{
        int ar2[10000][3] =
        {1, };

        int (*pa)[3];

        pa = ar2;



        return 0;
}

 

 

 

이와 관련하여 아래 링크에 자세히 안내되어 있으니 

참고하시기 바랍니다.

http://www.tcpschool.com/c/c_pointerArray_arrayPointer

https://dojang.io/mod/page/view.php?id=312

 

감사합니다.

 

===========================

(추가)

아래에 새로이 질문글을 남겨주셨군요..!

https://www.inflearn.com/questions/498987

잘못된 그림이 혼동을 야기할 수 있으니 위 질문글은 삭제 부탁드립니다,

혼란을 드려 죄송합니다.

감사합니다.

0

kangminchul

삭제된 글입니다

0

chang

네 답변 감사합니다!

저도 그림을 그려주며 설명해주신 것처럼 생각을 하고 있습니다. 그런데 강의에서는 그와 반대로 설명이 진행되는 것 같습니다.

9분 14초를 보시면, ar2를 pa에 담을 수 없는 이유가 (원소의 수가) "2개니까"라고 말씀하십니다.

 

보시면 int(*pa)[3]으로써, 설명해주신 "ar2는 배열의 원소가 두 개짜리인 배열이 세 개 입니다."를 따른다면 int(*pa)[3]은 배열 세 개를 가리킬 수 있는 포인터입니다.

 

int(*pa)[2]로 바꿔준 후 -> ar2[3][2]를 pa에 넣어주면 정상적으로 작동합니다.

 

==============================================================

민철님께서 바로 위에서 그림을 통해 설명해주셨는데, 강의에서는 ar[2][3]이 정상적으로 들어갈 때는 int(*pa)[2]가 아니라,  int(*pa)[3]일 때 입니다.

지금 문제점은, 저 또한 민철님께서 그려주신 것과 동일하게 int(*pa)[2]에서 ar[2][3]이 작동해야 한다고 이해하고 있지만 강의에서는 이와 반대로 int(*pa)[3]일때 ar1[2][3] 이 작동한다는 것입니다. 감사합니다.

 

0

chang

아직 제가 이해하지 못한 게, 이렇게 x[3][4]를 보면 4개짜리 원소들을 담은 배열이 3개가 있다고 이해했습니다.

 

선언하는 부분에서는 이게 다른 건가요??

Export template 안됨

1

28

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

56

3

main 함수에서 왜 int만 선언이 되는걸까요

1

57

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

55

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

138

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

61

2

getchar(), putchar()

1

94

3

강의자리ㅛ

1

80

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

114

2

소스파일안에 여러 파일

1

76

2

F5와 F7의 차이

1

79

2

c = TWO * (a+b); 에서 a와 b는?

1

59

2

; 세미콜론을 붙이는 기준에 문의

1

70

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

76

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

61

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

65

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

54

2