인프런 커뮤니티 질문&답변

denia park님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.15 포인터의 호환성

08:15초 (10.15) 2차원 배열의 주소를 일반 포인터에 담을 때 생기는 Warnimg 관련 질문

해결된 질문

20.02.09 11:25 작성

·

185

0

안녕하세요. 교수님

10.15강의 08:15초의 내용중에 교수님이 2차원 배열 주소를 그냥 포인터에는 담을수가 없다고 하셨습니다.

제가 똑같이 코드를 쳐서 빌드를 해보니 워닝이 뜨는 것을 확인했는데요. 실제로 printf로 돌려보니 주소는 제대로 뜨는 것도 확인했습니다. 

warning이면 "경고" 일 뿐 "error"는 아니기 때문에 쓰려고 하면 쓸수 있을 것 같은데 

쓰지 말아야하는 이유가 따로 있을까요 ??

#include <stdio.h>

int main()
{
    int* pt;
    int(*pt1)[3];

    int ar[2][3] = { 3, };

    pt = ar;
    pt1 = ar;

    printf("%p %p %p", pt, pt1, ar);
    
    return 0;
}

답변 2

2

홍정모님의 프로필 이미지
홍정모
지식공유자

2020. 02. 10. 01:45

C/C++  프로그래밍을 매우 저수준(low level)에서 할 경우에는 데이터의 구조를 보고 모두 포인터로 바꿔서(보다 정확히는 배열의 첫 주소) 효율적으로 프로그래밍을 합니다. 2차원 배열을 (1차원 = 그냥) 포인터로 캐스팅해서 사용하는 것도 흔한 일입니다. 다만, 포인터 연산을 할 때는, 예를 들어서 + 연산을 할 때는 바이트 단위가 아니라 자료형의 크기를 사용해야 하는데 포인터 캐스팅이 되면 그 포인터 연산 기준이 되는 자료형의 크기라 바뀌게되겠지요. (사실 그 자료형의 크기를 바꿔서 프로그래머가 편한 대로 포인터 연산을 하기 위해서 일부러 캐스팅을 하는 경우가 더 많습니다.)

C언어의 철학을 다시 한 번 생각해보세요. 참고로 C++에서도 워닝은 왠만하면 피하는 것을 권장합니다. C++에서 컨테이너 배우시면 안전하게 사용하시는 법을 이해하시게 될겁니다.

0

denia park님의 프로필 이미지
denia park
질문자

2020. 02. 10. 08:23

알려주셔서 감사합니다.