포인터 연산
예를 들어 포인터 변수 p에서 *p일 경우 주소가 가리키는 값을 표시하고 p일결우 주소 값을 가리킨다.
이점에 주의하여 연산을 해야 한다.
*p += 1, *p++, (*p)++ 의 차이점을 알아보자!
*p += 10 같은 경우는 쉽게 이해가 될 것이다.
큰 차이점을 보인 것은 (*p)++ 와 *p++이다.
연산자에서 우선순위가 있어서 나타나는 현상이다.
연산자의 우선순위를 따라 ++,--가 포인터 연산자보다 우선이다. 포인터 연산자는 우선순위 2위인 간접 참조*이다.
그래서 포인터보다 먼저 p의 값이 증가되어 주소 값이 증가된다.
(int는 4 바이트 이므로 주소 값이 4가 증가된다.) ++,-- 연산자를 사용할 때 주의해야 한다.
a = 0x7ffee993598c
*a = 5
a++ = 0x7ffee9935991
int형은 4bite여서 주소 값은 4가 차이 난다.
(*a)++ = 6
배열
배열을 보면 포인터와 매우 흡사하다 주소 값이 일정한 간격을 두고 연속으로 값이 저장되어있다.
보면 포인터는 주소 값을 저장하는 변수여서 포인터 변수 parr에 배열 arr의 시작되는 주소가 저장된다.
포인터 변수는 주소 값만 저장할 뿐 배열 자체가 되진 않는다. 그래서 사이즈의 크기가 다르게 나온다.
포인터 크기는 long변수와 같이 시스템의 32/64 비트에 따라 4/8 바이트의 크기를 가진다.
결과로 보면 배열은 그 안의 값까지 가지고 있고 포인터는 단지 배열이 시작되는 주소를 가지고 있을 뿐이다,
주소를 잘 활용하면 큰 이점이 있다. 하지만 사용하는 값이 주소인지 메모리값인지 잘 인지하고 사용해야 한다.
조금은 헷갈리고 꼬이는 일이 있을 수도 있다. 개념을 잘 이해하고 사용하자.
포인터 배열
포인터로 배열을 만들어 사용할 수 있다.
선언 할 때 일반 배열과 같은 구조다.
'CS > 알고리즘 및 자료구조' 카테고리의 다른 글
순서도란? (0) | 2020.10.23 |
---|---|
C언어 - 포인터 활용, call by value, call by reference (0) | 2020.10.16 |
C언어 - 포인터(Pointer) (0) | 2020.08.21 |
C언어 메모리 구조 [스택(Stack), 힙(Heap), 데이터(Data)영역] (0) | 2020.08.14 |
C언어 변수의 유효 범위 - 전역 변수, 지역 변수, 정적 변수, 레지스터 변수 (0) | 2020.08.07 |
댓글