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

부드러운 문어님의 프로필 이미지
부드러운 문어

작성한 질문수

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

10.14 2차원 배열과 포인터

배열, 포인터 주소 관련

작성

·

206

0

#include <stdio.h>

int main()
{
    //배열의 이름은 배열의 첫번째 인덱스 주소
    int arr1[] = { 101, 102, 103 };
    int arr2[] = { 104, 105, 106 };
    printf("%p,  %p,  %p\n", &arr1, arr1, &arr1[0]);
    
    int arr3[2][3] = { {1,2,3},{4,5,6} };
    printf("%p,  %p,  %p\n\n", &arr3, arr3, &arr3[0]);

    //포인터의 이름은 할당된 주소
    //&포인터는 포인터도 변수니까 그에 대한 주소(자료형에 관계 없이 메모리 주소 사이즈)
    int* prt = arr1;
    printf("%p,  %p,  %p\n", &prt, prt, arr1);
    
    int* parr[2] = {arr1[0],arr2[1]};
    printf("%p,  %p,  %p\n", &parr, parr, arr1);  

    return 0;
}

안녕하세요.

10.14 강의 내용 질문은 아니지만 이 강의부터 진도를 못나가고 있어요 ㅠ

'이름'에 대한 강조가 많아 혼란스러워 질문 드립니다.

1.

&배열이름($arr1)에서 배열 이름이 주소인데 앞에 &을 붙여 사용하는 경우도 있나요?

사용할 경우 그냥 arr1과 같은 주소 나오는 건가요?

2.

포인터에서 &prt와 prt 차이는

포인터도 변수니까 그에 대한 주소와

포인터에 할당된 주소 차이로 봐도 될까요?

3.

그런데 포인터[] 배열에서는 &parr, parr의 주소 같게 나오는데 이유가 궁금합니다. 이 주소는 변수 주소인가요?

늘 감사합니다.

답변 1

0

  1. &배열이름($arr1)에서 배열 이름이 주소인데 앞에 &을 붙여 사용하는 경우도 있나요?

    사용할 경우 그냥 arr1과 같은 주소 나오는 건가요?

>> 보통 배열의 이름이 곧 배열의 주소이기 때문에 굳이 &를 붙여 사용하지는 않는 것 같습니다.

결과는 첨부하신 코드를 실행해보면 알 수 있는데요, &arr1, arr1에 동일한 주소가 찍힘을 볼 수 있지요.

  1. 네, 그렇습니다.

  1. 1번의 답과 같습니다. 다만 parr자체가 주소이기 때문에 &parr로 사용하는 것보다 parr로 사용하는 것이 더 나은 용례입니다.

헷갈렸던 점이 '포인터 배열'을 포인터로만 생각해 포인터처럼 주소가 출력될줄 알았는데

배열처럼 주소가 나와서 였던거 같아요. 배열이라 생각하니 정리가 됩니다.

답변 감사합니다.

부드러운 문어님의 프로필 이미지
부드러운 문어

작성한 질문수

질문하기