| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 혼자 공부해서 개발까지
- Git
- javascript
- CSS
- 크래프톤 정글
- react
- HTML기초
- 팀프로젝트
- 알고리즘
- js
- 해시
- c언어
- Mini-React
- 그래프
- 프론트앤드
- BFS
- 프론트엔드
- 정렬
- html
- DFS
- frontend
- 알고리즘 기초
- 코딩
- 코딩테스트
- 그리디
- 개발자
- 프로그래머스
- 백준
- 정글
- Python
Archives
- Today
- Total
민혁이의 IT스토리
포인터 배열& 배열 포인터 본문
제목에서 느꼈듯 C를 공부하다가 이상한 놈들을 만났다
이름만 봐도 그렇듯
'포인터 배열’과 ‘배열 포인터’ 때문에 헷갈리기 쉽다고 느꼈다
나도 한참 혼동했지만, 정리하면서 이해한 과정을 공유하려고 한다.
포인터 배열
정의: 포인터 여러 개를 모아둔 배열
설명: int형 포인터 4개를 담는 배열이라면, 각 원소는 int 하나를 가리키는 포인터이다.
#include <stdio.h>
int main() {
int a = 10, b = 20, c = 30;
int *arr[3] = { &a, &b, &c }; // 포인터 배열
printf("%d\n", *arr[0]); // 10
printf("%d\n", *arr[1]); // 20
printf("%d\n", *arr[2]); // 30
}
- 그림으로 이해
arr[0] → &a → 10
arr[1] → &b → 20
arr[2] → &c → 30
단순히 말해서, 변수의 주소값이 모여있는 배열을 만들었다고 생각하면 이해가 쉬워진다.
- arr은 포인터 3개를 담은 배열이고,
- *arr[i]로 실제 값에 접근할 수 있습니다.
배열 포인터
정의: 배열 한 덩어리를 가리키는 포인터
설명: int형 4개짜리 배열을 가리키는 포인터입니다.
#include <stdio.h>
int main() {
int arr[2][4] = { {1,2,3,4}, {5,6,7,8} };
int (*p)[4] = arr; // 배열 포인터
printf("%d\n", (*p)[0]); // 1
printf("%d\n", (*p)[1]); // 2
p++; // 다음 행으로 이동
printf("%d\n", (*p)[0]); // 5
}
- 그림으로 이해
p → arr[0] → {1,2,3,4}
p+1 → arr[1] → {5,6,7,8}
간단히 설명하면, "하나의 배열을 포인터에 담는다"라고 생각해라
추가 설명 :
배열은 0번째 인덱스 주소에서 부터 순서대로 연결되어 있다. 따라서 2차원배열도 주소로 접근을 하게 되면
arr[1][2]가 아닌 (*p)[4] = 5 이렇게 접근을 할 수 있게 된다.
차이점 비교
| 구분 | 선언 | 의미 | 접근 방법 |
| 포인터 배열 | int *p[3] | 포인터 여러 개 | *p[0], *p[1] |
| 배열 포인터 | int (*p)[3] | 배열 한 줄 | (*p)[0], (*p)[1] |
내가 이해한 헷갈림 포인트
- 괄호 () 위치의 중요성
- *p는 “배열 한 덩어리 전체”
- p++ 의미
- 포인터 배열 → 다음 포인터로 이동
- 배열 포인터 → 다음 배열 한 줄로 이동
- 배열 포인터는 int (*)[N] 타입이므로 단일 포인터(int *)와 다름
마무리
처음에는 그냥 말장난 하는줄 알았는데 이해하니까
완전히 다르다는걸 깨달았고 C언어에 대한 이해도가 한층도 높아진 것 같아
뿌듯하다.