포인터와 배열의 관계
💡 배열 이름은 해당 배열의 첫번째 요소의 주소값을 갖는다
이를 확인하기 위해 배열을 선언하고 값을 할당한 뒤 각각의 배열 요소 값, 주소, 배열 이름을 printf 해보자.
#include <stdio.h>
int main(void)
{
int i ;
int arr[] = {1,2,3,4,5} ;
printf("배열 요소 출력 : ");
for(i=0; i<5 ; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
printf("배열 요소의 주소 출력 : ");
for(i=0; i<5 ; i++)
{
printf("%p ",&arr[i]);
}
printf("\n");
printf("배열 이름 출력 : ");
for(i=0; i<5 ; i++)
{
printf("%p", arr);
}
printf("\n");
return 0 ;
}
즉, 배열의 이름은 배열을 가르키는 포인터이다.(= arr 와 &arr[0] 는 일치) 다만 배열의 이름과 일반적인 포인터의 차이점은 '배열의 이름은 상수' 라는 것이다.
상수의 특징은 변경이 불가하다는 것이다. 따라서 배열의 이름이 가르키는 대상은 프로그램이 종료될 때까지 변경할 수 없다. (배열 이름에 새로운 값을 대입하면 오류가 발생함) 그래서 일반 포인터들은 '포인터 변수' 라 불리지만, 배열의 이름과 같은 포인터는 '포인터 상수'라고 불린다.
배열의 이름을 포인터처럼 사용
배열의 이름은 포인터이기 때문에 일반 포인터와 같이 *연산자와 함께 사용할 수 있다.
#include <stdio.h>
int main(void)
{
int arr[] = {1,2,3,4,5} ;
int i ;
printf("배열 요소 인덱스로 출력 : ");
for(i=0; i<5 ; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
printf("배열 이름을 포인터로 사용하여 배열 요소 출력 : ");
for(i=0; i<5 ; i++)
{
printf("%d ",*(arr+i));
}
printf("\n");
return 0 ;
}
포인터를 배열의 이름처럼 사용
배열의 이름을 포인터로 사용할 수 있을 뿐 아니라, 포인터를 배열의 이름으로 사용할 수도 있다
#include <stdio.h>
int main(void)
{
int arr[] = {1,2,3,4,5} ;
int i ;
int *pTemp = arr; // 포인터 pTemp로 배열의 이름(=배열의 주소)을 대입
printf("배열 요소 출력 : ");
for(i=0; i<5 ; i++)
{
printf("%d ", pTemp[i]);
}
printf("\n");
return 0 ;
}
아래 그림을 활용해서 위의 상황을 보다 잘 이해할 수 있다.
Reference
1. C Programming : A Modern Approach, 2/E K. N. King | W. W. Norton & Company
반응형
'C' 카테고리의 다른 글
[C] 연결리스트 | 연결리스트란 / 연결리스트 생성 / 노드 삽입 / 검색 / 노드 삭제 (2) | 2022.10.24 |
---|---|
[C] 문자열 리터럴 (문자열 상수) | 문자열 리터럴의 저장, 포인터, 문자열 변수와 문자열 상수 (1) | 2022.10.23 |
[C] 포인터 | 포인터란, 포인터 변수의 선언/초기화/호출, &연산자와 *연산자, 포인터의 연산, 포인터에 자료형이 필요한 이유 (0) | 2022.10.22 |
[C] 반복문 | while문, do-while문, for 문, break, continue (0) | 2022.10.21 |
[C] 조건문 | if문 & switch문 (0) | 2022.10.21 |
댓글