포인터란 어떠한 값을 저장하는게 아닌 어떠한 값의 주소를 저장하는 것

어떠한 값의 주소라함은 해당값이 저장된 컴퓨터 메모리상의 주소를 의미한다.

포인터 변수를 만들 때는 변수이름앞에 *를 붙여주면 그 변수는 포인터 변수가 된다.

(사용할 때 일반변수와의 구분을 위해 주로 " *p변수이름" 의 형식으로 사용한다)

이것의 결과를 보면 pnum의 실질적인 값은 num의 주소이며, num의 값을 가리키고 있음

여기서 &연산자는 &오른쪽에 오는 피연산자의 주소값을 반환하는 연산자이다.

그리고 포인터도 가리키고자하는 변수의 자료형에 따라 포인터변수도 그에 맞춰 다르게 선언한다.

ex) duble num;

    double *pnum;  // double형 포인터 변수 pnum 

 

char cha;

char *pcha; // char형 포인터 변수 pcha 

사실 주소값은 동일한 시스템에서 그 크기가 동일하며, 모두 정수의 형태를 띈다. 하지만 모두 다 똑같이 int형으로 포인터 변수를 선언한다면, 다른 사용자나 자신 그리고 시스템은 해당 포인터 변수가 무엇을 가리키는건지 알기 힘듬.

그래서 *이 붙은 자료형은 포인터 형이라 한다. 물론 포인터도 값을 저장하는 변수이기에 자료형의 범주에 포함된다.

또 하나의 사실은 *의 위치는 크게 상관이 없다.

ex) int* pnum;

    int *pnum;

   int * pnum;

위처럼 프로그래머 마음대로 골라 쓰면됨.

*연산자는 포인터가 가리키는 메모리공간에 접근할 때 사용되는 연산자이며, 포인터 변수를 이용해 포인터 변수가 가리키는 변수의 값을 바꿀 수도 있다. 


널 포인터(NULL Pointer)

포인터를 선언만 하고, 초기화해주지 않으면, 내부에는 쓰레기값으로 채워지는데, 이는 그 포인터 변수가 어디를 가리킬지 아무도 알 수 없다.
설령 포인터가 가리키는 주소가 메모리상에서 아주 중요한 공간이라도 모를 것이다.
거기다가 아래의 코드처럼 *연산으로 임의의 수를 저장하면, 프로그램에 치명적인 결과를 가지고 올 수 있다.
그렇다면 초기값을 대충 1234로 해야하나? 이것도 안된다. 왜냐하면 이 1234번지가 메모리의 어디에 있는지 알 수 없다. 고로 쓰레기 값으로 채우는 것과 다를 바없다.
그래서 NULL값을 이용하는 것이다.
이 둘이 의미하는 바는 같다 왜 0과 NULL이 같은 의미를 지니냐면 0은 아스키코드에서 NULL이기 때문이다. 
그리고 0이라는 숫자가 들어가면 *pnum1이 0번지를 가리키진 않는다.
여기서 0(NULL)의 의미는 해당 포인터 변수는 아무것도 가리키고 있지 않다고 할 수 있다.

 

'PLC' 카테고리의 다른 글

[25] 데이터 테이블 조작명령  (0) 2020.02.19
[24] 구조화명령  (0) 2020.02.19
[23] 데이터 처리명령  (0) 2020.02.19
[22] 데이터 처리 명령  (0) 2020.02.19
[21] 데이터 처리명령  (0) 2020.02.19

+ Recent posts