반응형
SMALL

6.2.2 포인터 변수의 선언

(3) void형 포인터

- 형식 : void *포인트명;

- 의미 : 프로그램 실행시에 자료형이 결정되는 경우에 사용
           저장하기 전에 명시적 형 변환이 필요

//void 형 포인터의 사용[예]

#include <stdio.h> 
void main(){ 
   int a = 100; 
   char b = 'b'; 
   void *p = NULL;  // void형 포인터를 선언한 후 초기화  
   p = (int*)&a;   // void형 포인터 p 에 int 형 변수 a 의 주소를 명시적 형변환을 이용하여 대입  
   printf("*p = %d \n", *(int*)p); 
   p = (char*)&b;  // void형 포인터 p에 char형 변수 b의 주소를 명시적 형변환을 이용하여 대입  
   printf("*p = %c \n", *(char*)p);  }

 

일반변수와 포인터변수

 

 

6.2.3 포인터 연산

 p 가 포인터인 겨우 p를 1증가시키면 실제 증가되는 주소(번지)는 *p의 자료형의 byte수가 된다.

 

예를 들어 p = 100 이면   int *p 일 때       (p+3)의 번지는 100 + 3*4 번지

                                 char *p 일 때      (p+3)의 번지는 100 + 3*1 번지  

                                 double *p 일 때  (p+3)의 번지는 100 + 3*8 번지  

 

* 포인터와 기억공간의 대응 관계

//포인터 연산 예1

#include <stdio.h>
void main(){
int *p, a[] = {10, 20, 30, 40, 50};
p = &a[0];  // 배열 첫 번째 요소 주소값을 포인터 변수에 p에 저장

printf("*p  == %d \n", *p) ; 
printf("*p++== %d \n", *p++); 
//포인터 p의 값을 출력 후 주소 1(4byte) 증가 
printf("*++p== %d \n", *++p); 
//포인터 p의 주소 1(4byte) 증가 후 포인터 p의 값 출력 
p = p + 2;  
printf("*p  == %d \n", *p); 
printf("a[2]== %d \n", a[2]); 
printf("*p+2== %d \n", *p +2); }  //포인터 p값의 크기 2 증가 

 

** 주의 할 점 : *(p+2) 와 *p+2의 구별을 분명히 해야 함

 *( p + 2 ) : (p번지 + 2) 번지의 내용

   *p + 2   : p 번지의 내용에 2를 더한 값

 

// 포인터 연산 [예2]

#include <stdio.h>
void main(){
   int *p, *q;
   int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
   p = &a[3];
   printf("*p == %d \n", *p);
   printf("*(p+3)==%d \n", *(p + 3)); // *(p+3)과 *p+3 구별에 주의

   q = p +3; 
   printf("*q == %d \n", *q); 
   printf("p - q == %d \n", p - q); // 두 포인터 간 뺄셈  
   printf("q - p == %d \n", q - p);   }  // 두 포인터 간 뺄셈  
//printf("q + p == %d \n", q + p); //두 포인터 간 덧셈은 불가능 

 

 

 

 

반응형
LIST

'방송통신대학 > C 프로그래밍' 카테고리의 다른 글

포인터와 배열 pointer array  (0) 2020.06.10
포인터와 배열 char pointer , array  (0) 2020.06.09
배열과 포인터 array, pointer  (0) 2020.06.07
char형 배열과 문자열  (0) 2020.06.06
다차원 배열 array  (0) 2020.06.05

+ Recent posts