포인터 연산
포인터 연산은 포인터 변수에 +, - 연산자를 사용하여 값을 빼거나 더하는 것을 의미한다.
*, / 연산자는 사용할 수 없다.
포인터 변수는 메모리 주소를 가리키고 있는 변수이다.
따라서 포인터 연산을 하면 포인터 변수가 가리키고 있는 주소를 변경하게 되는 것이다.
포인터 연산은 포인터 자료형의 크기만큼 연산을 실행한다.
예를 들어 4바이트 크기의 int 형 변수의 주소 00A3FC00 를 가리키고 있는 포인터 변수의 값을
2만큼 증가시키면 00A3FC02 를 가리키는 것이 아니다.
00A3FC00 부터 00A3FC04 까지 변수가 저장되어 있기 때문에 제대로 된 값을 불러올 수 없기 때문이다.
따라서 포인터 변수의 값을 2만큼 증가시키면 00A3FC08 을 가리키게 된다.
위 내용을 코드로 확인해 보겠다.
#include <stdio.h>
int main()
{
int num;
int* ptr = #
printf("%p\n", ptr);
ptr = ptr + 2;
printf("%p\n", ptr);
ptr--;
printf("%p", ptr);
return 0;
}
따라서 위 코드에서는 ptr 의 주소값이 8 증가했다가 4 감소하는 것을 확인할 수 있다.
포인터 연산과 배열
포인터 연산을 배열에도 응용할 수 있다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
ptr++;
printf("%d\n", *ptr);
return 0;
}
위 코드에서 ptr 은 초기화할 때 arr 을 가리키고 있지만 증감 연산자를 통해 가리키는 주소가 4 증가하였다.
따라서 출력을 하게 되면 arr[1] 에 저장되어 있는 2가 출력된다.
포인터 연산과 증감연산자 우선순위
연산자 우선순위는
괄호, 후위 증감 연산자가 1순위
전위 증감 연산자, 포인터 연산자가 2순위이다.
따라서 아래 코드의 연산 순서는 다음과 같다.
#include <stdio.h>
int main()
{
int arr1[3] = {10, 20, 30};
int arr2[3] = {10, 20, 30};
int arr3[3] = {10, 20, 30};
int arr4[3] = {10, 20, 30};
int arr5[3] = {10, 20, 30};
int arr6[3] = {10, 20, 30};
int arr7[3] = {10, 20, 30};
int arr8[3] = {10, 20, 30};
int* ptrA = arr1;
int* ptrB = arr2;
int* ptrC = arr3;
int* ptrD = arr4;
int* ptrE = arr5;
int* ptrF = arr6;
int* ptrG = arr7;
int* ptrH = arr8;
printf("%d %d\n", ++(*ptrA), *ptrA);
printf("%d %d\n", (*ptrB)++, *ptrB);
printf("%d %d\n", ++*ptrC, *ptrC);
printf("%d %d\n", *ptrD++, *ptrD);
printf("%d %d\n", *(++ptrE), *ptrE);
printf("%d %d\n", *(ptrF++), *ptrF);
printf("%d %d\n", *++ptrG, *ptrG);
printf("%d %d\n", *ptrH++, *ptrH);
return 0;
}
ptrA
ptrA의 주소를 참조하여 arr1[0]을 출력한 후 1증가하고 참조한 값을 출력
따라서 11, 11 출력
ptrB
ptrB의 주소를 참조하여 arr2[0]을 출력한 후 참조한 값을 출력하고 1 증가
따라서 10, 11 출력
ptrC
* 가 ++ 보다 먼저 연산되므로 ptrA 와 동일
따라서 11, 11 출력
ptrD
ptrD의 주소를 참조하여 arr4[0]을 출력한 후 ptrD의 주소값 4 증가
따라서 10, 20 출력
arr4[0] 의 값은 11 이 됨
ptrE
ptrE의 주소값이 4 증가하고 ptrE의 주소를 참조하여 arr5[1] 을 출력
따라서 20, 20 출력
ptrF
ptrF의 주소를 참조하여 arr6[0] 을 출력하고 ptrF의 주소값 4 증가
따라서 10, 20 출력
ptrG
++가 * 보다 먼저 연산되므로 ptrE 와 동일
따라서 20, 20 출력
ptrH
ptrF와 동일
따라서 10, 20 출력
'C언어 > C언어 문법' 카테고리의 다른 글
[C언어] 문자열 (변수 형태의 문자열, 상수 형태의 문자열) (0) | 2024.02.13 |
---|---|
[C언어] 동적할당 (stdlib.h, malloc, free) (0) | 2024.02.12 |
[C언어] 배열의 주소 (0) | 2024.02.12 |
[C언어] 포인터 (단일, 다중포인터, 주소값, 참조와 역참조, 포인터배열) (0) | 2024.02.11 |
[C언어] 2차원배열, 다차원배열 (0) | 2024.02.11 |