본문 바로가기
개념/혼자 공부하는 C언어

chapter 15) 주소로 쓰이는 배열명과 배열의 주소 비교

by kiseno 2024. 9. 13.
728x90
반응형
SMALL
#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));
```

이 수정은 포인터 주소를 더 정확하고 안전하게 출력하는 방법을 사용합니다.

728x90
반응형
LIST