공부/이모저모

C언어 배열이름에 &붙이는 경우(&배열이름??)

JUNFUTURE 2021. 10. 19. 01:31
#include <stdio.h>

int main()
{
    int a = 3;
    //&(변수) -> 변수가 있는 주소
    int arr[2] = { 1,2 };
    printf("%p ", &arr+3); //BASEADD+24
    printf("%p ", arr+1); //BASEADD+4
    //두 값의 차이는 십진수 20
    return 0;
}

&arr+3과 arr+1의 주소 값 차이는 십진수 20이 날 것이다.

실제로

전자 : 0x9f5c3afbe0

후자 : 0x9f5c3afbcc

가 나와서 주소 값의 차이는 0x14 (십진수 20)이 나온다!!

 

arr = &arr[0]의 값을 가리키고 있는 포인터
arr[0] -> int
&arr[0] -> int *
arr+1 일때 1의 의미는 int의 바이트 수 (4)

&arr = arr배열의 주소를 가리키고 있는 포인터
arr -> int[2]
&arr -> int[2]*
&arr+1 일때 1의 의미는 int[2]의 바이트 수 (4*2)

 

arr는 배열의 첫번째 인자(배열 요소 ex. int)를 가리키는 포인터 => int*

&arr는 해당 배열(ex. int[n])의 포인터 => int[n]*

 

int*과 int[n]* 자료형의 차이

ptr이 int*라면, ptr+1은 4byte가 더해짐!!!

ptr이 int[3]*라면, ptr+1은 4byte*3가 더해짐!!!

주소 값 자체는 같으나 이걸 arr 배열 요소(int)의 포인터(int*)로 보느냐? 배열 하나 통째를 하나의 값(int[2])으로 보는 포인터(int[2]*)로 보느냐?