와드의 블로그

15. 배열과 포인터 본문

프로그래밍 언어/C

15. 배열과 포인터

Ward 2021. 9. 17. 20:41

(1) 배열과 포인터 표기법

 

* 배열 표기법과 포인터 표기법의 관계

배열은 [] 연산자를 사용하여 표현하고 포인터는 * 연산자를 사용하여 나타낸다. 포인터는 포인터 변수가 가리키는 메모리의 시작 주소를 기준으로 삼고, 배열도 해당 배열이 사용하는 메모리 그룹의 시작 주소를 기준으로 삼는다. 따라서 두 문법은 표기만 다를 뿐 비슷한 문법이다. 그래서 배열과 포인터는 표기법을 서로 바꿔 쓸 수 있다.

char data[5]
data[1] = 5; // 둘은 같은 동작을 한다.
*(data + 1) = 5;
char data;
char* p = &data;
*p = 3; // 둘은 같은 동작을 한다.
p[0] = 3;

 

(2) 배열 시작 주소

 

* 배열 변수의 이름은 배열의 시작 주소

포인터는 일반 변수의 주소만 가질 수 있는 것이 아니라 배열과 같이 그룹으로 묶인 메모리의 주소도 가질 수 있다. 

char* p = &data[0];
char* p = &*(data + 0);
char* p = &*data;
char* p = data

위 네 가지 동작은 모두 같기 때문에 &data[0]과 data가 같다. 따라서 배열 변수의 이름은 배열의 시작 주소이다.

 

* 배열은 포인터가 아니다.

배열이 포인터처럼 작동한다고 해서 완벽하게 포인터가 될 수는 없다. 포인터는 다른 변수의 주소를 저장할 수 있지만 배열 이름은 상수화된 주소이기 때문에 변경할 수 없다.

 

(3) 배열을 사용하는 포인터

 

* 포인터로 배열의 주소를 저장하여 사용하기

int data[5] = { 1,2,3,4,5 };
sum = 0, select = 2;
int* p = data + select;
for(int i = 0; i <10; i++)
	sum += *p;

 

(4) 배열과 포인터의 합체

 

* 배열을 기준으로 포인터와 합체하기

포인터 변수가 여러 개 필요할 때 포인터 변수도 배열로 선언해서 사용할 수 있다. 

char data1, data2, data3, data4, data5;
char* p[5] = { &data1, &data2, &data3, &data4, &data5 };
for(int i = 1; i <= 5; i++)
	*p[i] = i;

 

* 포인터를 기준으로 배열과 합체하기

char (*p)[5]와 같이 선언하면 배열과 포인터가 결합되는 것인데, 포인터 문법에 괄호를 사용했기 때문에 포인터가 기준이 된다. p변수는 요소가 5개인 char 형의 배열을 가리키는 포인터 변수이다. 이러한 형태의 사용은 2차원 배열을 나타낼 때 주로 사용한다.

char data[3][5];
char (*p)[5];
p = data;
(*p)[1] = 3 // p[0][1]과 같다.
(*(p+2))[4] = 5; // p[2][4]와 같다.

 

 참조자료: C언어 입문

'프로그래밍 언어 > C' 카테고리의 다른 글

17. 다차원 포인터  (0) 2021.09.17
16. 메모리 할당  (0) 2021.09.17
14. 표준 입력 함수  (0) 2021.09.16
13. 포인터  (0) 2021.09.16
12. 배열과 문자열  (0) 2021.09.14