본문 바로가기
학교

C언어 - Pointer, Array 정리

by 발빠진 쥐 2026. 4. 8.

*p (역참조) : p 가 가리키는 주소의 값을 읽음

int x = 42;
int *p = &x

// *p -> 42

 

p[i] = *(p+i)

 

p+i 는 p 에서 sizeof(T)*i (칸수로 이동하는 느낌)

 

p++/p-- 는 다음/이전 원소로 이동 (배열 순회)

 

p==q / p<q 는 같은 배열내에서 객체 비교할 때 쓰임 (p<q ==1 이면 p 가 앞임)

 

 

**p

int *p1
int **p2
int ***p3

*p1 -> int 값

 

*p2 -> 주소 / **p2 -> int 값

 

*p3 -> 주소 / **p3 -> 주소 / ***p3 -> int 값

 

p3(0xC000) → p2(0x9000) → p1(0x5000) → x=42(0x1000). 역참조 * 개수 = 레벨 수

 

 

**여기 헷갈림

 

int *p[3] 
//p 는 크기 3짜리 배열이고 각 원소의 타입이 int* 이다.
//int* 를 3개 담는 배열
//p[0] p[1] p[2] 각각이 int* (어딘가를 가리킴)

int (*p)[3]
//p 는 포인터이고 int 3개짜리 배열을 가리킨다
//int[3] 배열 그 자체를 가리킴 
//이 상황에서 ++p 를 할 시 3*4 로 12byte 이동 ( 배열의 열 만큼 이동 )

 

 

차원별로 배열이 있음 (Array decay 설명)

int a[5];

int a[2][3];

int a[2][3][4];

 

1차원 배열

int arr[4] = {10,20,30,40};

&arr;   //int (*)[4] -> 4칸짜리 배열 전체를 가리킴

arr;    //int * -> 첫 번째 원소 가리킴 즉, &arr[0]

arr[0]; //int -> 첫 번째 원소의 값. 10

 

2차원 배열

int arr[2][3];

&arr;      //int(*)[2][3]  -> 2*3 배열 그 자체를 가리킴
arr;       //int(*)[3]     -> 3칸짜리 행 하나 가리킴 == &arr[0]
arr[0];    //int*          -> &arr[0][0]
arr[0][0]; //int          -> [0][0]에 위치한 요소 하나의 값 


//위의 4줄 다 주소는 배열의 시작주소로 같음.
//그러나 타입과 증가 단위가 다르니 주의
//arr + 1 은 한 행 (3칸 이동)
//&arr + 1 은 전체 배열 (6칸 이동)

 

 

int (*p3[2])[4]

 

int (*p3)[2][4]

int(*(p3[2]))[4]

 

int(*(*p3)[2])[4])

 

int(*(*p5)[3])[4]

 

 

ㅋㅋㅋ

 

 

arr[1][2]    ==     (*(arr+1))[2]    ==     *(*(arr+1)+2)      ==     *(arr[1]+2)

 

 

약간 이런느낌인듯 하네요!!

 

선언포인터 변경값 변경암기법

const int *p 가능 불가 * 앞에 const → 값 고정
int *const p 불가 가능 * 뒤에 const → 포인터 고정
const int *const p 불가 불가 양쪽 const → 둘 다 고정