●포인터
⦁포인터란 특정 기억공간 의 시작 주소값이다.
특정 기억공간 : 특정 자료형의 변수 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이 아니라는 것이다. 이는 포인터 변수 자체가 주소값을 가리키기 때문에 &를 붙일필요가 없으며 * 만으로도 역참조가 가능하다.
여러개의 포인터 변수가 같은 기억공간을 가리키게 할수도 있다.