코딩 농장/C 언어
C언어 배열 / 포인터 연산
GreenBNN
2021. 7. 6. 22:09
포인터 연산을 쉽게 이해하려면 아래 문장을 아는게 도움이 된다.
"배열의 이름은 주소값으로 변환된다. 또한 포인터는 가리키는 것의 주소값이다."
#include <stdio.h>
int main()
{
int a[3] = { 1, 2, 3 };
int* ptr = &a;
return 0;
}
→ 배열의 첫 번째 원소를 참조하는 표현식들은 아래와 같다.
a[0] = *(a + 0) = *(ptr + 0) = ptr[0]
a[1] = *(a + 1) = *(ptr + 1) = ptr[1]
→ *(a + 1) 과 *(p + 1) 에서 a, p 는 주소값이므로 뒤에 더해지는 숫자는 주소값으로 변환이 되어야 한다.
먼저 배열 a 의 원소들은 int 형이기 때문에 1 * 4bit 가 주소값에 더해진다. ptr 도 마찬가지이다.
<포인터 연산>
printf("ptr[0] : %d\n", ptr[0]);
printf("%p\n", ptr++);
printf("ptr[0] : %d\n", ptr[0]);
printf("%p\n", ptr);
→ 위 코드를 추가해서 실행시켜 보자.
→ 첫번째 ptr[0] 의 값은 배열의 첫번째 원소인 1 이 출력된다. // ptr 은 배열의 첫번째 원소의 주소값이 저장됨
→ 이후 ptr++ = ptr + 1 이 되어 ptr 의 주소값에 int 형 변수의 크기인 4 가 더해진다. // ptr 은 배열의 두번째 원소의 주소값이 저장됨
→ 다시 ptr[0] 을 호출하면 배열의 두번째 원소인 2 가 출력된다.
#include <stdio.h>
int main()
{
int arr[] = {0,1,2};
int *p = arr + 2; // 2
printf("%d\n", *(p-1));
printf("%d\n", *p-1);
printf("%d\n", *(p--));
printf("%d\n", *p );
return 0;
}
포인터 p 는 arr[2] 의 주솟값을 가리킴
*p = arr[2] 값
*(p-1) = arr[1] 값
*p -1 = arr[2] - 1 값
*(p--) = arr[2] 값 반환하고 포인터 p 는 arr[1] 의 주솟값을 가리킴
*p = arr[1] 값