코딩 농장/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] 값