1. *ptr++

 =>①포인터 ptr의 대상체를 읽고    다음 위치로 이동


ex)

#include<stdio.h>


int main()

{

 int ar[]={10,20,30,40,50};

 int i, *ptr;


 for(i=0; i<5; i++)

     {

       printf("%d",*ptr++);

     }

}




 ☆  *++ptr 을 사용하면 전혀 다른 결과가 출력된다 : ++가 먼저 연산되기 때문에 ptr이 다음 주소로 이동 후 대상체를 읽게 되어 원치않는 ar[5] 값도 읽게 된다.


 ☆  (*ptr)++ 도 전혀 다른 결과를 얻게 된다 : ptr의 대상체를 읽고 난 후 그 값을 ++(증가) 시키는 것이어서 전혀 다른 결과가 나온다!

      출력결과 : 11, 12, 13, 14, 15



2. Void형 포인터

 

 void *vp;         이렇게 선언하면 대상체가 정해져있지 않은 포인터가 생성된다.


 <특 징>


 1) 임의의 대상체를 가리킬 수 있다  :  void형 포인터는 어떠한 대상체라도 가리킬 수 있다. 정수, 실수 모두 가능

    * 반대로 임의의 포인터에 void형 포인터를 대입할 때는 반드시 캐스팅을 해야한다

   ex) pi=(int *)vp;

    pd=(double *)vp;


 2) * 연산자를 쓸 수 없다 : void형 포인트는 임의의 대상체에 대해 번지수만 저장할 수 있다. 따라서 이 포인터가 가리키는 메모리의 값을 읽을 수 없다



 

void main()

{

     int i=1234;

     void *vp;

 

     vp=&i;

     printf("%d\n",*vp);

} 

  vp에 i의 번지수가 저장되었다.

  그러나 ! *vp로 정수 i의 값을 읽을 수는 없다!


  만약 정말로 읽고 싶다면 printf("%d",*(int *)vp); 로 캐스트 연산자를

  사용해야 한다.


 3) 증감 연산자를 쓸 수 없다 : 대상체의 크기를 모르기 때문에 얼마나 이동해야 하는지 모르기 때문이다.


 결론 : void형 포인터는 순수하게 메모리의 한 지점을 가리키는 기능만 가지는 포인터라고 할 수 있다




3. Void형 포인터의 활용


 memset 함수를 살펴보자


 void *memset(void *s, int c, size_t n);     => s번지에서 n바이트만큼 c값으로 가득 채워라. 주로 배열을 초기화 시키는데 사용된다


 (활용)

    int ari[10];

char arc[20];

double ard[30];

 

memset(ari,0,sizeof(ari));

memset(arc,0,sizeof(arc));

memset(ard,0,sizeof(ard));


여기서 보면 memset함수가 void형 포인터로 받기 때문에 int, char, double형 배열에 상관없이 받을 수 있다.



4. NULL 포인터


 NULL 포인터 : 0으로 정의되어 있는 포인터의 상수값이다.


시스템 영역에 응용 프로그램이 고유의 데이터를 저장할 수는 없으므로 포인터 변수가 0번지를 가리키는 상황은 발생할 수 없다. 그래서 이런 상황은 일종의 에러로 간주되며 그렇게 하기로 약속되어 있다. 포인터를 리턴하는 거의 대부분의 함수는 에러가 발생했을 때 NULL값을 리턴한다.


ex)

if (func()==NULL) {

     // 에러 처리

} else {

     // 하고 싶은 일

}

 


-> 함수의 리턴값이 NULL인지 아닌지 점검해 보고 NULL이 아닐 때만 원하는 작업을 하며 에러 발생시 적절하게 에러 처리해야 한다. 




출처 : www.soen.kr



'Engineering > Data Sturcture' 카테고리의 다른 글

포인터공부4 - 이중포인터  (0) 2016.03.16
포인터공부3 - 동적메모리 할당  (0) 2016.03.15
포인터공부 1  (0) 2016.03.15
2. What is the running time ?  (0) 2016.03.09
1. ' Bubble Sort ' vs ' Merge Sort '  (0) 2016.03.05

+ Recent posts