포인터와 1차원 배열
포인터를 배열에 사용할 때 배열 이름은 배열의 시작 주소를 의미한다.
int arr[4] = {1, 2, 3, 4};
int *p = arr;
가령 이렇게 배열과 포인터를 선언하고,
printf("%x %x", p, &arr[0]);
배열 이름으로 초기화한 포인터 변수 p와 arr[0]의 주소, 즉 배열의 시작 주소를 출력하면 같은 값이 나오게 된다.
이는 결국 p + 0 또한 같다는 의미가 되어,
<배열의 주소> &arr[0] == p == p+0 == arr 이 성립한다.
같은 주소라면 이것이 가리키는 값도 같다는 의미이다.
<배열의 값> arr[0] == *arr == *(arr + 0) == *p == *(p + 0) == p[0]
결론
&arr[0] == p == p+0 == arr
arr[0] == *arr == *(arr + 0) == *p == *(p + 0) == p[0]
포인터와 1차원 배열을 응용하는 백준 2747
백준 2747에서는 n을 입력받고 n번째 피보나치 수를 출력하는 코드를 요구한다.
2747번: 피보나치 수
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가
www.acmicpc.net
여기서 n은 45를 넘지 않는다.
문제를 보았을 때 다음과 같은 해결 방법을 생각해볼 수 있었다.
1) 45번째까지 저장할 수 있는 배열, 즉 arr[46] 을 만들고 초기화해준다.
2) arr[0], arr[1] 을 각각 0, 1로 초기화한다.
3) arr[2]의 주소를 가지는 포인터 변수를 선언한다.
4) 반복문을 통해서 i가 n이 될 때까지 피보나치 수열을 구해준다.
4-1) 이때, 피보나치 수열을 구하는 방법은 *p = *(p-2) + *(p-1) 이다.
'C' 카테고리의 다른 글
[C] void형 포인터 (0) | 2023.11.13 |
---|---|
[C] 포인터와 문자열 (0) | 2023.11.12 |
[C] 포인터와 2차원 배열 (0) | 2023.10.26 |
[C] 배열 포인터, 포인터 배열 (0) | 2023.10.26 |
[C] 포인터와 함수 (0) | 2023.10.26 |