배열의 이름은 값을 바꿀 수 없는 상수 형태의 포인터 이다.
#include <stdio.h>
int main(void)
{
int arr[] = {0,1,2};
printf("배열의 이름 : %p\n", arr);
printf("첫 번째 요소 : %p\n",&arr[0]);
printf("두 번째 요소 : %p\n",&arr[1]);
printf("세 번째 요소 : %p\n",&arr[2]);
return 0;
}
/* output :
배열의 이름 : 0061FF14
첫 번째 요소 : 0061FF14
두 번째 요소 : 0061FF18
세 번째 요소 : 0061FF1C
*/
int형 배열의 요소간 주소 값의 차는 4바이트 인것을 확인할 수 있다. 또한 모든 배열 요소는 메모리 공간에 나란히 할당됨을 알 수 있다. 배열의 이름은 배열의 시작 주소 값을 의미하고, 그 형태는 값의 저장이 불가한 상수이다.
배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 * 연산이 가능하다.
#include <stdio.h>
int main(void)
{
int arr1[] = {1,2,3};
double arr2[] = {1.1,2.2,3.3};
printf("%d %g\n", *arr1, *arr2);
*arr1 += 100;
*arr2 += 120.5;
printf("%d %g\n", *arr1, *arr2);
return 0;
}
/* output:
1 1.1
101 121.6
*/
배열의 이름이 가리키는 것은 배열의 첫번째 요소이기 때문에 배열의 이름을 대상으로 *연산을 하면 배열의 첫번째 요소에 접근된다.
#include <stdio.h>
int main(void)
{
int arr[] = {10,20,30};
int *ptr = &arr[0];
printf("%d %d\n", ptr[0], arr[0]);
printf("%d %d\n", ptr[1], arr[1]);
printf("%d %d\n", ptr[2], arr[2]);
return 0;
}
/* output :
10 10
20 20
30 30
*/
위 코드와 같이 포인터를 배열의 이름처럼 사용할 수도 있다.
'Language > C, C++' 카테고리의 다른 글
[C] 문자열 포인터 (0) | 2020.12.18 |
---|---|
[C] 포인터 연산 (0) | 2020.12.17 |
[C] 포인터 변수 (0) | 2020.12.16 |
[C] 1차원 배열(2) (0) | 2020.12.14 |
[C] 1차원 배열(1) (0) | 2020.12.12 |