선언할 때
자료형 *포인터이름
int n = 5;
int *p; // 정수형 포인터 p 선언
사용할 때
*포인터 = 값, &변수 = 포인터
p = n; // 컴파일 에러, 타입 불일치
p = &n; // p는 변수 n을 가리킴
printf(*p); // 5 출력
배열에 포인터를 붙일 때는
int *p[3]; // 3개의 정수 포인터를 요소로 가지는 배열 p
int (*p)[3] // 3개의 정수를 요소로 가지는, int[3] 타입 배열의 주소를 가리키는 포인터 p
만약 포인터에 배열을 할당한다면
// 이 둘은 완전히 같은 의미임. arr만 쓰면, 밑의 것으로 자동 치환됨
p = arr;
p = &arr[0];
// 주의 - p와 arr[0]의 타입이 맞아야 함. 즉 p가 arr보다 한 차원 낮은 배열을 가리켜야 함
// arr가 2차원이므로 p는 1차원, 안 맞으면 컴파일 에러
// 만약 배열 자체의 주소가 필요하다면
p = &arr; // 이 경우엔 p와 arr의 차원이 일치해야 함
???: 만약 arr가 빈 배열이면 어떡함?
→ C언어에서 빈 배열은 허용되지 않음. 선언 자체가 컴파일 에러 유발함
추가로 다음과 같은 관계 성립
p[i] == arr[i] == &arr[i][0] // p[i]는 밸류가 아닌 포인터 값 - arr이 p보다 한 차원 높기 때문
p[i][j] == arr[i][j] // arr의 차원 수만큼 인덱싱하면 개별 요소에 접근 가능
포인터 연산은 해당 포인터가 가진 타입의 크기만큼을 고려함 (단위: 바이트)
p + 1 하는 상황을 고려했을 때