C언어 - 포인터 연산, 포인터와 배열의 관계
본문 바로가기
CS/알고리즘 및 자료구조

C언어 - 포인터 연산, 포인터와 배열의 관계

by IYK2h 2020. 8. 28.
728x90

 

포인터 연산


예를 들어 포인터 변수 p에서 *p일 경우 주소가 가리키는 값을 표시하고 p일결우 주소 값을 가리킨다.

이점에 주의하여 연산을 해야 한다.

*p += 1, *p++, (*p)++ 의 차이점을 알아보자!

*p += 10 같은 경우는 쉽게 이해가 될 것이다.

큰 차이점을 보인 것은 (*p)++ 와 *p++이다.

연산자에서 우선순위가 있어서 나타나는 현상이다. 

첨부 - https://m.blog.naver.com/PostView.nhn?blogId=ruvendix&logNo=220897246448&proxyReferer=https:%2F%2Fwww.google.com%2F

연산자의 우선순위를 따라 ++,--가 포인터 연산자보다 우선이다. 포인터 연산자는 우선순위 2위인 간접 참조*이다.

그래서 포인터보다 먼저 p의 값이 증가되어 주소 값이 증가된다.

(int는 4 바이트 이므로 주소 값이 4가 증가된다.) ++,-- 연산자를 사용할 때 주의해야 한다.

a = 0x7ffee993598c

*a = 5

a++ = 0x7ffee9935991

int형은 4bite여서 주소 값은 4가 차이 난다.

(*a)++ = 6

 


 

배열


 

배열을 보면 포인터와 매우 흡사하다 주소 값이 일정한 간격을 두고 연속으로 값이 저장되어있다.

보면 포인터는 주소 값을 저장하는 변수여서 포인터 변수 parr에 배열 arr의 시작되는 주소가 저장된다.

포인터 변수는 주소 값만 저장할 뿐 배열 자체가 되진 않는다. 그래서 사이즈의 크기가 다르게 나온다.

포인터 크기는 long변수와 같이 시스템의 32/64 비트에 따라 4/8 바이트의 크기를 가진다.

결과로 보면 배열은 그 안의 값까지 가지고 있고 포인터는 단지 배열이 시작되는 주소를 가지고 있을 뿐이다,

주소를 잘 활용하면 큰 이점이 있다. 하지만 사용하는 값이 주소인지 메모리값인지 잘 인지하고 사용해야 한다.

조금은 헷갈리고 꼬이는 일이 있을 수도 있다. 개념을 잘 이해하고 사용하자.

 

포인터 배열


포인터로 배열을 만들어 사용할 수 있다.

선언 할 때 일반 배열과 같은 구조다.

 

C언어 - 포인터(Pointer)

C언어 - 포인터 활용, call by value, call by reference

728x90

댓글