공부/이모저모

C언어 배열 시작주소에 연산 (arr+1) 해석

JUNFUTURE 2021. 10. 19. 02:43
#include <stdio.h>

#define R 10
#define C 5

int main()
{
    int(*p)[R][C]; 


    //5*10=50개의 배열을 갖는 하나의 포인터 p선언.

    int arr[10][5];
    printf("%p\n", arr); //arr는 int[10][5]
    printf("%p\n", arr+1); 
    //arr+1은 int[5]를 가리키는 포인터 int[5]* 포인터의 요소가 int[5]일뿐.
    //int arr[3] 하고 arr+1이 int를 가리키는 포인터라는 것과 같은 이유
    printf("%d\n", sizeof(arr)); //arr의 크기는 int[10][5] 배열의 크기 4*5*10
    printf("%d\n", sizeof(arr+1)); //arr+1의 크기는 int[5]를 가리키는 포인터의 크기 결국 64비트

    printf("%d\n", sizeof(p)); //p는 int*
    printf("%d\n", sizeof((*p)+1)); //*p는 int[r][c]
    printf("%d\n", sizeof(*p)[R]); //(*p)[r]은 int[r]
    printf("%d\n", sizeof(*p)[R][C]); //(*p)[R][C]는 int
    
    //p는 포인터다. int[R][C] 를 가리키는 포인터
    //*p 이 포인터 p를 역참조 한 것이므로 int[R][C] 값 그 자체다
    //(*p)[R]은 p를 역참조 한 int[R][C]에서 R번째 행 int[C]를 나타낸 것이다.
    //(*p)[R][C]는 p를 역참조한 int[R][C]에 담긴 값 int를 나타낸 것이다.
    return 0;
}

배열 시작주소 + 1 연산을 하면 해당 값은 배열 안의 요소를 가리키는 포인터가 된다!!

 

ex)
int arr[3];

arr+1은 int* !!!!

 

int arr[5][10];

arr+1은 int[10]*!!!

 

결국 둘다 크기는 8byte(64비트 컴퓨터, 포인터 변수의 크기)

 

c언어에서
(무언가)* 자료형 란
(해당 포인터가 가리키고 있는 요소의 자료형)* 이다.

 

ex)
int[5]*은

int[5]를 가리키고 있는

포인터이다.