본문 바로가기

Lobo's study room/[혼공단]c언어스터디

[6주차]포인터란?

#변수와 포인터

메모리에 공간을 확보하고, 그 곳을 데이터를 넣고 꺼내 쓰는 공간으로 사용

 

변수는 선언된 블록({ }), 함수 내부로 사용이 제한됨.

따라서 같은 변수명을 사용하더라도 블록이나 함수가 다르면 별도의 저장 공간을 확보하므로  전혀 다른 변수로 사용됨

변수를 사용하는 가장 쉬운 방법은 이름을 쓰는 것!

 

포인터는 사용 범위를 벗어난 경우에도 데이터를 공유할 수 있다.

포인터는 주소를 저장하는 일정한 크기의 메모리 공간으로 언제든지 다른 주소를 저장하거나 포인터끼리 대입할수있다.

그러나, 일반 변수와는 달리 대입 연산에 엄격한 기준이 적용된다.

포인터를 사용하려면 추가적인 변수 선언이 필요하고 주소 연산, 간접 참조 연산 등 각종 연산을 수행해야 한다.

임베디드 프로그래밍을 할 때 메모리에 접근하는 경우나 동적할당한 메모리를 사용하는 경우에는 포인터가 반드시 필요하다.

 

#메모리의 주소

메모리는 데이터를 넣고 꺼내 쓰는 공간

프로그램이 사용하는 메모리의 위치는 주소 값으로 식별 할 수 있다.

메모리의 위치를 식별하는 주소 값은 바이트 단위로 구분되는데 이 값은 0부터 시작하고 바이트 단위로 1씩 증가한다.

 

#주소 연산자 : &

저장된 공간을 주소로 사용하는 방법

주소 : 변수가 할당된 메모리 공간의 시작 주소.

시작 주소를 알면 그 위치부터 변수의 크기만큼 메모리를 사용할 수 있다.

주소는 &을 사용해서 구한다.

단항 연산자이며, 변수만을 피연자로 사용하여 시작 주소를 구한다.

주소 연산자 &을 사용하여 변수에 할당된 메모리의 시작 주소를 확인하고 시작 주소에 변수의 크기를 더하면 변수가 메모리의 어디서부터 어디까지 할당되었는지 확인 할 수 있다.

 

#포인터와 간접 참조 연산자 *

메모리의 주소는 필요할 때마다 계속 주소 연산을 수행하는 것보다 한 번 구한 주소를 저장해서 사용하면 편리하다.

포인터가 바로 변수의 메모리 주소를 저장하는 변수이다.

따라서 주소를 저장할 포인터도 변수처럼 선언하고 사용하는데 이때 변수앞에 *을 붙인다.

자료형 *변수명;

pa->a

포인터 pa는 변수 a가 메모리 어디에 할당되었는지 그 위치를 기억하고 있다.

즉, pa는 a를 가리킨다.

 

포인터가 가리키는 변수를 사용할 때는 포인터에 특별한 연산자를 사용하는데, 이를 간접 참조 연산자(*) 또는 포인터 연산자라고도 한다.

 

*pa는 대입 연산자(=)의

왼쪽에 올 때는 pa가 가리키는 변수의 저장공간으로 사용되고,

오른쪽에 올 때는 pa가 가리키는 변수의 값으로 사용된다.

 

포인터가 가리키는 변수의 형이 같다면 포인터를 연속으로 선언할 수 있다. 다만, 포인터임을 뜻하는 *는 변수마다 붙여야 한다.

 

#const

포인터에 const를 사용하면 가리키는 변수의 값을 바꿀 수 없다는 의미이다.

즉, pa가 가리키는 변수 a는 pa를 간접 참조하여 바꿀 수 없다는 의미이다

 직접 a값을 바꾸는 것은 가능 but 포인터를 통해서는 바꿀수 없다.

 

#주소와 포인터

모든 주소와 포인터는 가리키는 자료형에 관계없이 크기가 같다.

 

주소는 할당된 메모리 저장 공간의 시작 주소 값 자체로 상수이다.

간접 참조 연산자를 쓸 수 있지만 상수이므로 대입 연산자 왼쪽에 올 수 없다.

 

포인터는 그 값을 저장하는 또 다른 메모리 공간으로 다른 주소를 대입하여 값을 바꿀 수 있다.즉 변수이다.

하나의 변수를 동시에 가리키는 일도 가능하다.

저장할 주소의 크기에 따라, 즉 크기가 클 수록 더 넓은 범위의 메모리를 사용할 수 있다.

 

#포인터의 대입 규칙

1)포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다.

변수의 형태가 다르면 할당되지 않은 영역까지 사용하여 알 수 없는 결과 출력.

 

2)형 변환을 사용한 포인터의 대입은 언제나 가능하다.

포인터로 메모리를 직접 쪼개 쓰는 방식.