본문 바로가기
TIL (Today I Learned)/C 기초 문법

[C 기초 문법] 포인터와 배열

by 둥굴프 2022. 12. 26.
이 포스팅은 한국기술교육대학교 김덕수 교수님의 '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)

 

이럴 때는 포인터와 포인터 산술 연산으로 데이터에 접근할 수 있다.

 

 

댓글