010. POINTER

Posted on by pkchan

010-01 // REFERENCE OPERATOR, DEREFERENCE OPERATOR

02.VARIABLE – 1에서 변수의 메모리 할당을 공부했습니다. 변수가 선언되면 자료형의 크기만큼의 메모리 공간이 할당되고 그 공간에는 주소가 있습니다.

4 bytes 의 int 변수가 할당받은 공간이라면 각각의 바이트마다 주소가 있습니다. 변수는 할당받은 공간이 처음 시작되는 곳의 주소를 가지고 있습니다. 이 주소를 리턴해주는 연산자가 scanf() 함수에서 사용했던 ‘&’입니다. ‘&’는 주소를 참조하는 단항연산자입니다.

/*
 example 010-01
 C language pointer
*/

#include <stdio.h>

int main() {

          int var = 5;

          printf("Value: %d\n", var); //var의 값을 출력
          printf("Address: %u", &var); //var의 주소를 출력

          return 0;

}

var의 주소는 실행하는 컴퓨터마다 실행할 때마다 다를 수 있습니다. 함수가 실행할 때마다 할당되고 함수가 종료되면 사라지는 변수니까요.
var에 대입된 값을 참조하기 위해서 var이라는 변수 이름을 사용합니다. 직접 참조하는 방식입니다. 위 예제에서 배운 주소를 참조하는 연산자를 사용하여 var의 주소를 구하고(&var), 간접 참조 연산자인 ‘*’을 붙이면 (*&var) 주소가 가리키는 곳에 있는 값을 참조할 수 있습니다. 그러면 결국 var과 *&var은 완전히 같습니다.

& => 주소를 참조하는 단항연산자
* => 주소가 가리키는 곳에 있는 값을 참조하는 단항연산자

010-02 // DECLARATION POINTER VARIABLE

포인터 변수는 다른 변수의 주소를 가질 수 있는 변수입니다. 값은 대입이 불가능하며 오직 주소만 대입이 가능합니다. 다른 변수의 주소를 가지고 있으므로 *연산자를 통해 다른 변수의 값에 접근 할 수 있습니다.

(참조할 값의 자료형)* (포인터 변수의 이름);

이와 같이 선언하며, 포인터 변수는 짧게 포인터라고 부릅니다.

int형 변수 a를 선언하고 100을 대입하고 주소가 300이라고 가정합니다. 그리고 포인터 변수를 선언하고 a의 주소, &a를 대입하면 포인터인 p에는 a의 주소가 대입됩니다. p는 a의 주소를 가지고 a를 가리키고 있습니다. 포인터 p에 간접 참조연산자를 붙이고 500을 대입하면 (*p = 500;) a의 값이 500으로 바뀝니다. a == *p 가 성립하니까요.

/*
 example 010-02
 C language pointer
*/

#include <stdio.h>

int main(){

          int c = 22;
          int* pc;

          printf("Address of c:%u\n",&c);
          printf("Value of c:%d\n\n",c);

          pc=&c;

          printf("Address of pointer pc:%u\n",pc);
          printf("Content of pointer pc:%d\n\n",*pc);

          c=11;

          printf("Address of pointer pc:%u\n",pc);
          printf("Content of pointer pc:%d\n\n",*pc);

          *pc=2;

          printf("Address of c:%u\n",&c);
          printf("Value of c:%d\n\n",c);

          return 0;

}

010-03 // CONSTANT POINTER

const와 함께 포인터를 선언하여 값이 변하지 않도록 상수화 시킬 수 있습니다.

const (자료형)* (포인터 이름);

이와 같이 선언한다면 포인터에 다른 변수의 주소는 대입할 수 있지만 간접 참조 연산자(*)로 값은 바꿀 수 없습니다. 상수화되는 거죠. 그러면 주소를 상수화하여 바꿀 수 없도록 하고 값을 바꾸고 싶다면,

(자료형)* const (포인터 이름);

이렇게 선언하면 됩니다. const를 변수 앞으로 이동하여 선언해주면 주소는 고정되고 간접 참조 연산자(*)로 값은 바꿀 수 있습니다. 주소가 고정되므로 선언 시에 초기화해주어야 합니다.

const (자료형)* const (포인터 이름);

이렇게 선언하면 주소와 값 모두 상수화되어 값을 바꿀 수 없습니다.

010-04 // POINTER TO POINTER

포인터는 어떤 특정 변수를 가리킵니다. 포인터를 가리키는 포인터는 이중 포인터라고 부릅니다.

/*
 example 010-03
 C language pointer to pointer
*/

#include <stdio.h>

int main() {
          
          int var = 777;
          int* p = &var;
          int** pp = &p;
          
          printf("var의 값은 %d입니다.\n\n",var);
          printf("*p의 값은 %d입니다.\n\n",*p);
          printf("**pp의 값은 %d입니다.\n\n",**pp);
          
          return 0;
          
}

Leave a Reply