이 포스팅은 한국기술교육대학교 김덕수 교수님의 'C언어 Lv2' 강의를 바탕으로 작성됐습니다.
배열 이름은 연속된 메모리 공간의 시작 주소
배열의 이름 전달 👉 메모리 주소 전달
- 배열을 전달 한 것과 같은 효과 (call-by-reference)
- 배열의 원소 접근가능
#1 포인터의 산술 연산 (Pointer Arithmetic)
사용 가능 산술 연산 : +, -, ++, --
포인터가 가리키는 대상의 data type의 크기(bytes)만큼 증/감
주의사항
*(p+1) vs (*p+1) : 포인터 산술 연산 vs 포인터 간접 참조한 값 연산
*++p vs ++*p : 포인터 산술 연산 vs 포인터 간접 참조한 값 연산
*(asterisk)의 위치에 따라 결괏값이 달라질 수 있다.
#2 포인터로 다차원 배열에 접근하기
ptr이라는 이름의 포인터로 2차원 배열에 접근하려 할 때 ptr[1][3]처럼 입력하면 에러가 발생한다.
왜냐면 선행된 ptr[1]이 값이기 때문에 뒤에 [3]인덱싱을 할 수 없다.
* hint : 포인터 산술 연산
Memory layout : 메모리속에 데이터가 저장된 형태( or 순서)
다차원 배열의 원소는 가장 하위 차원부터 순차적으로 나열됨
a[row][col] = a + (row*|col|) + col
|col| : 열의 길이
a[x][y][z] = a + z * (|y|*|x|) + y*|x| + z
"최하위 차원을 제외하고는 다 주소다."
#3 포인터로 배열 접근하는 이유
모든 데이터는 일련의 byte 집합
외부에서 들어오는 데이터는 메모리 공간에 바이트들의 집합 (a sequence of bytes)으로 저장됨
파일 입출력, 다른 프로그램과의 통신, 네트워크 등
동적 메모리 할당 👉 메모리 시작 주소만 반환
데이터가 들어있는 메모리 시작 주소와 데이터 형태 정보를 기반으로 데이터에 접근해야 함
데이터 형태 정보는 약속 (ex, Protocol)
이럴 때는 포인터와 포인터 산술 연산으로 데이터에 접근할 수 있다.
'TIL (Today I Learned) > C 기초 문법' 카테고리의 다른 글
[C 기초 문법] 이중 포인터 (0) | 2022.12.26 |
---|---|
[C 기초 문법] 포인터 주의사항 (0) | 2022.12.25 |
[C 기초 문법] 포인터? (1) | 2022.12.25 |
댓글