본문 바로가기

Language/C

포인터


포인터

⦁포인터란 특정 기억공간시작 주소값이다.

특정 기억공간 : 특정 자료형의 변수 ex) int a⟵a는 특정 자료형의 변수이다.

시작 주소값 : 자료형의 크기가 1바이트 이상일수 있기 때문이다.

⦁포인터는 자료형에 대한 정보를 담고 있다.(특정 자료형을 가리킨다)

⦁포인터는 일정크기를 갖는 정수값이다.⦁포인터는 가리키는 기억공간이 다를지라도 포인터 자체의 크기는 항상 일정하다.

ex)char ch;

printf("size of pointer : %d\n",sizeof(&ch));

printf("address : %p\n",&ch);

위의 예문은 포인터를 구해서 크기와 값을 출력하는 것이다. 첫 번째 &ch 는 1이 나올것이고 %p(주소값을 출력하는 변환지정자이다)값은 16진수로 ch의 주소가 출력되는 것이다.

⦁포인터의 역참조

포인터에 역참조연산자(*)(포인터 연산자)를 사용하여 그것이 가리키는 변수를 참조할 수있다.

ex)char ch = 10;

(1)printf("d\n",*&ch);

*&ch = 20;

(2)printf(""%d\n",ch);

ch 가 10의 값을 가지고 (1)과 같이 출력할시 &ch 는 ch 의 주소를 가르키지만 *&ch는 ch 주소의 내용을 가르키는 것이다(역참조). 이를 응용하여 20을 대입한다음 ch를 그대로 출력하면 변경된 내용의 값이 저장되어있다.

한마디로 역참조된 기억 공간은 일변 변수와 완전히 같은 거라고 볼 수 있다.

⦁포인터 변수

포인터를 저장하는 기억공간이다. 한마디로 포인터변수 안에는 주소만이 저장될수 있으며 형식은 다음과 같다.

<형식> * pointer name;

포인터 변수는 포인터가 가리키는 것과 같은 것을 가리켜야 한다. 이 포인터 변수또한 역참조가 가능하며 변수의 크기도 그것이 가리키는 것과 상관없이 항상 같다.

ex)int thing = 10;

int *thing_pur = &thing;//일반 변수에 &연산자로 주소를 추출한후 포인터 연산자

printf("%d\n",*thing_ptr);//에 대입하여야 한다.

*thing_ptr = 20;

printf("%d\n",thing);

이 예문이 위의 예문과 다른 것은 *&thing_ptr이 아니라는 것이다. 이는 포인터 변수 자체가 주소값을 가리키기 때문에 &를 붙일필요가 없으며 * 만으로도 역참조가 가능하다.

여러개의 포인터 변수가 같은 기억공간을 가리키게 할수도 있다.