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); //두 포인터 간 덧셈은 불가능
'방송통신대학 > 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 |