배열명으로 배열 요소 사용하기
주소는 정수처럼 보이지만 자료형에 대한 정보를 갖고 있는 특별한 값이다
주소 + 정수 --> 주소 + (정수 + 주소를 구한 변수의 크기)
==> 배열명은 첫 번째 배열요소의 주소 값이다
<배열명에 정수 연산을 수행하여 배열 요소 사용>
#include <iostream>
int main(void)
{
int ary[3];
int i;
*(ary + 0) = 10;
*(ary + 1) = *(ary + 0) + 10; // ary[1] = ary[0] + 10
printf("세 번째 배열 요소에 키보드 입력 : ");
scanf_s("%d", ary + 2);
// ary[2]가 세 번째 배열 요소이므로 &를 사용하여 입력, ary + 2는 &ary[2]와 같다
for (i = 0; i < 3; i++)
{
printf("%5d", *(ary + i)); // ary[i]
}
return 0;
}
==> 포인터를 배열로 바꿔서 쓸 수 있다
==> 배열의 대괄호([ ])는 포인터 연산의 '간접 참조, 괄호, 더하기' 연상 기능을 갖는다
Q. 배열의 할당 영역을 벗어나는 포인터 연산식은 사용할수 있을까?
사용할 수 있으나 사용하면 안 된다. 즉, 문법적으로 문제가 없으므로 컴파일은 되나 실행할 때 결과를 예상할 수 없다. 예를 들어 배열 요소의 개수가 3개인 ary 배열에서 ary + 3은 네 번째 배열 요소의 주소가 되고 * (ary + 3)은 네 번째 배열 요소가 된다.
그곳은 배열에 할당된 영역이 아니므로 함부로 사용하면 안 된다. 만약 다른 변수나 배열에 할당되어 있다면 그 값이 바뀔 수도 있고 또는 운영체제가 관리하는 영역이라면 프로그램이 강제종료될 가능성도 있다. 또한 ary[3]의 배열 요소 표현식도 결국 포인터 연산식으로 바뀌므로 마찬가지로 주의해야 한다.
배열명 역할을 하는 포인터
- 배열명은 주소이므로 포인터에 저장할 수 있다.
- 이 경우 포인터로도 연산식이나 대괄호를 써서 배열 요소를 쉽게 사용할 수 있다
<배열명처럼 사용되는 포인터>
#include <stdio.h>
int main(void)
{
int ary[3]; //배열 선언
int* pa = ary; //포인터에 배열명 저장
int i; //반복 제어 변수
*pa = 10; //첫 번째 배열 요소에 10 대입
*(pa + 1) = 20; //두 번째 배열 요소에 20 대입
pa[2] = pa[0] + pa[1]; //대괄호를 써서 pa를 배열명처럼 사용
for (i = 0; i < 3; i++)
{
printf("%5d", pa[i]); //포인터로 모든 배열 요소 출력
}
return 0;
}
int *pa=ary;
==> 배열이 메모리 100번지부터 할당되었다면 배열명 ary의 주소 값은 100번지가 되고, 포인터 pa는 100을 저장하여 첫 번째 배열 요소를 가리키는 상태가 된다.
==> 포인터가 배열명을 저장하면 배열명처럼 사용할 수 있다
'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
배열을 처리하는 함수 (1) (0) | 2023.01.26 |
---|---|
배열과 포인터의 관계 (2) (0) | 2023.01.26 |
전처리 지사자 (2) (0) | 2023.01.11 |
전처리 지시자 (1) (0) | 2023.01.10 |
포인터 완전 정복을 위한 포인터 이해하기 (2) (0) | 2022.12.21 |