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 |