#include <stdio.h>
int main(void){
int ary[5];
printf("ary value : %u\t", ary);
printf("ary address : %u\n", &ary);
printf("ary + 1 : %u\t", ary + 1);
printf("&ary + 1 : %u\n", &ary + 1);
return 0;
}
### 배열과 포인터 연산
- `int ary[5];`는 5개의 정수를 저장할 수 있는 배열을 선언합니다.
- `printf("ary value : %u\t", ary);`는 배열의 이름 `ary`를 사용하여 배열의 첫 번째 요소의 주소를 출력합니다. 배열 이름은 첫 번째 요소의 주소를 가리키므로, 이는 배열의 시작 주소입니다.
- `printf("ary address : %u\n", &ary);`는 배열 전체의 주소를 출력합니다. 배열의 이름 앞에 `&` 연산자를 사용함으로써, 배열 전체의 시작 주소를 얻을 수 있습니다. 배열의 이름과 배열 전체의 주소는 값이 같지만, 타입이 다릅니다. `ary`는 첫 번째 요소의 주소를, `&ary`는 배열 전체의 주소를 나타냅니다.
- `printf("ary + 1 : %u\t", ary + 1);`는 배열 이름에 1을 더한 결과, 즉 첫 번째 요소의 다음 주소를 출력합니다. 이 연산은 배열의 첫 번째 요소 다음의 주소를 가리키므로, 정수의 크기(예를 들어, 4바이트)만큼 주소가 증가합니다.
- `printf("&ary + 1 : %u\n", &ary + 1);`는 배열 전체 주소에 1을 더한 결과를 출력합니다. 이 경우, 배열 전체의 크기만큼 주소가 증가합니다. 여기서는 `int` 배열이므로 `int` 5개의 크기, 즉 `int` 하나의 크기(예: 4바이트) * 5만큼 주소가 증가합니다.
### 주의사항
- 출력에서 `%u` 형식 지정자를 사용하고 있습니다. `%u`는 `unsigned int`형의 값을 출력하기 위한 형식 지정자입니다. 포인터의 주소를 출력할 때는 `%p` 형식 지정자를 사용하는 것이 더 적절하며, 이 때는 포인터 값을 `(void*)`로 캐스팅하여 호환성을 보장하는 것이 좋습니다.
올바르게 수정된 코드의 `printf` 부분은 다음과 같이 될 수 있습니다:
```c
printf("ary value : %p\t", (void*)ary);
printf("ary address : %p\n", (void*)&ary);
printf("ary + 1 : %p\t", (void*)(ary + 1));
printf("&ary + 1 : %p\n", (void*)(&ary + 1));
```
이 수정은 포인터 주소를 더 정확하고 안전하게 출력하는 방법을 사용합니다.
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 15) 포인터와 이중 포인터의 관계 (0) | 2024.09.15 |
---|---|
chapter 15) 포인터 배열의 값을 출력하는 함수 (0) | 2024.09.14 |
chapter 15) 이중 포인터를 사용한 포인터 교환 (0) | 2024.09.12 |
chapter 15) 배열 포인터로 3차원 배열의 값 출력 (0) | 2024.09.11 |
chapter 14) 2차원 배열의 값을 출력하는 함수 (0) | 2024.09.10 |