▩ 포인터(Pointer)
- Pointer는 지시자의 뜻
- 기억장치의 주소를 변수의 값으로 사용 하는것이 목적
- 포인터 변수의 선언: 데이터 타입 *포인터변수명
. int* pk; int * pk; int *pk;
- & 연산자: 변수의 메모리상에 데이터가있는 주소를 알려줌
. int k=10; 이라고 선언했다면 &k라고하는 것은 k라는 변수의 값 10이 있는 메모리의 주소를 가
져옵니다.
. k변수의 주소입니다.
- 출력은 주소는 양수만 있음으로 %u로 출력함
- * 표시는 포인터 변수 선언문이 아닌 곳 즉 수식문에서는 그 포인터 변수가 가지고 있는 주소의
값을 가지고 옴
- 포인터 변수는 Borland C에서는 2바이트, Visual C++에서는 4바이트임
- 포인터를 사용하면 함수로 인자의 주소를 전달할 수 있어 매우 편리하다.
scanf("%d", &kuk);의 경우를 이해할 것.
#include <stdio.h>
void main( void )
{
int i, result;
float fp;
char c, s[81], d;
//printf("%d", d);
//exit(0);
printf( "\n\n정수, 실수, 문자, 문자열을 입력하세요.\n");
result = scanf( "%d %f %c %s %d", &i, &fp, &c, s, d);
printf( "\n입력받은 데이터의 수 %d\n", result );
printf( "The contents are: %d %f %c %s %c\n", i, fp, c, s, d);
}
- 포인터 변수는 더하거나 빼는 연산을 할 수 있다.
. 포인터 변수 + 1: 포인터 변수가 가리키는 곳의 주소가 포인터 변수의 데이터형 만큼 증가한다.
. *포인터 변수 + 1: 포인터 변수가 값으로 가지고있는 주소가 가르키는 값을 1 증가 시킨다.
. *(포인터 변수 + 1): 포인터 변수가 가리키는 곳의 주소를 포인터 변수의 데이터형 만큼 증가시
킨 후 그 값을 1 증가시킨다.
1. 포인터 변수의 선언
int k=10;
int *kp = &k;
printf("%d\n", *kp); 라고 선언하면
. int *kp는 포인터 변수를 의미한다.
. &k는 k변수의 주소를 의미한다.
. 포인터 변수 kp는 k의 주소를 저장한다.
. kp는 int형 포인터 변수임으로 int형 변수의 주소만 저장할 수 있다.
. 수식문에서 *kp라고하면 kp가 값으로 가지고있는 주소의 값을 가져온다.
>>>>> 포인터 변수의 선언
#include <stdio.h>
#include <conio.h>
void main() {
int i;
printf("i의 값은 %d입니다.\n", i);
printf("i의 주소는 %X입니다.\n", &i);
printf("\ni의 값을 입력하세요 : ");
scanf("%d",&i);
printf("i의 값은 %d입니다.\n", i);
printf("i의 주소는 %X입니다.\n", &i);
getch();
}
>>>>> 정수형 변수의 주소 출력, 주소 할당의 진행 방향의 이해
#include <conio.h>
#include <stdio.h>
void main() {
int i = 10;
int j = 20;
int k = 30;
printf("정수형 변수 i의 값은 %d입니다.\n", i);
printf("정수형 변수 i의 주소는 %u입니다.\n", &i);
printf("정수형 변수 j의 값은 %d입니다.\n", j);
printf("정수형 변수 j의 주소는 %u입니다.\n", &j);
printf("정수형 변수 k의 값은 %d입니다.\n", k);
printf("정수형 변수 k의 주소는 %u입니다.\n", &k);
getch();
}
>>>>> 다양한 데이터형의 주소 출력
char c = 'A';
int i = 10;
변수의 선언 형태가 위와 같을 경우 Borland C는 int변수는 2바이트를 사용하고 1바이트는 버린다.
VisualC++은 char는 무조건 4바이트를 사용합니다.
#include <stdio.h>
#include <conio.h>
void main() {
char c = 'A';
int i = 10;
float f = 2.1;
char c1 = 'A';
char c2 = 'B';
printf("문자형 변수 c의 값은 %c입니다.\n", c);
printf("문자형 변수 c의 주소는 %u입니다.\n", &c);
printf("정수형 변수 i의 값은 %d입니다.\n", i);
printf("정수형 변수 i의 주소는 %u입니다.\n", &i);
printf("실수형 변수 f의 값은 %f입니다.\n", f);
printf("실수형 변수 f의 주소는 %u입니다.\n", &f);
printf("문자형 변수 c1의 값은 %c입니다.\n", c1);
printf("문자형 변수 c1의 주소는 %u입니다.\n", &c1);
printf("문자형 변수 c2의 값은 %c입니다.\n", c2);
printf("문자형 변수 c2의 주소는 %u입니다.\n", &c2);
getch();
}
2. 포인터 변수의 작동
메모리 할당 모델 대응하는 소스코드
=========================================================
Mapping 변수명 주소 값
----------------------------------
int k 1000 10 int k = 10;
----------------------------------
int m 996 20 int m = 20;
----------------------------------
int* pk 992 1000 int* pk = &k;
----------------------------------
int* pm 988 996 int* pm = &m;
----------------------------------
>>>>> 다양한 데이터형의 포인터 변수의 출력
#include <stdio.h>
#include <conio.h>
void main() {
char c='A';
int i=10;
float f=2.1f;
char *cp; //char형 변수의 주소를 저장합니다.
int *ip; //int형 변수의 주소를 저장합니다.
float *fp; //float형 변수의 주소를 저장합니다.
//각종 타입의 변수의 주소를 포인터 변수에 저장
cp=&c;
ip=&i;
fp=&f;
printf("문자형 포인터 cp의 값은 %c입니다.\n", *cp);
printf("정수형 포인터 ip의 값은 %d입니다.\n", *ip);
printf("실수형 포인터 fp의 값은 %f입니다.\n", *fp);
printf("char형 변수 c의 주소:%d \n", &c);
getch();
}
변수 주소 값
-----------------
c 5052 A <--- c='A'
i 5048 10
f 5044 2.1f
cp 5040 5052 <--- cp = &c;
ip 5036 5048 <--- ip = &i;
fp 5032 5044 <--- fp = &f;
- c: 'A'
- &c: 5052
- cp: 5052
- &cp: 5040
- *cp: 'A'
>>>>> 포인터 변수의 초기화
char *cp=&c;
은 char *cp; cp=&c;로 분리 실행된다.
#include <stdio.h>
#include <conio.h>
void main() {
char c='A';
int i=10;
float f=2.1;
char *cp=&c;
int *ip=&i;
float *fp=&f;
printf("문자형 포인터 cp의 값은 %c입니다.\n", *cp);
printf("정수형 포인터 ip의 값은 %d입니다.\n", *ip);
printf("실수형 포인터 fp의 값은 %f입니다.\n", *fp);
getch();
}
UP!!!▷ 'k'라는 변수를 선언해 100을 대입하고, 'kp'라는 포인터 변수를 선언하고,
'kp'란 포인터 변수를 이용해 'k'의 값을 출력하는 프로그램을 작성하세요.
>>>>> 포인터 변수 자신의 주소 출력하기 1
#include <stdio.h>
#include <conio.h>
void main() {
int i=10;
int *ip=&i; //i 변수의 주소를 ip포인터 변수에 할당합니다.
printf("==================================================\n");
printf("i의 값은 %d입니다.\n\n", i);
printf("i의 자신의 주소는 %u입니다.\n", &i);
printf("ip의 값은 %u입니다.\n\n", ip);
printf("ip가 가지고 있는 주소의 값은 %d입니다.\n", *ip);
printf("ip의 자신의 주소는 %u입니다.\n", &ip);
printf("==================================================\n");
getch();
}
3. 아래와 같이 선언된 경우 c 변수는 1바이트를 버린다., Visual C는 무조건 4바이트씩 사용
>>>>> 포인터 변수 자체의 주소 출력
#include <stdio.h>
#include <conio.h>
void main() {
char c='A';
int i=10;
float f=2.1;
char *cp=&c;
int *ip=&i;
float *fp=&f;
printf("==================================================\n");
printf("①문자형 변수 c의 값은 %c입니다.\n", c);
printf("②문자형 변수 c의 주소는 %u입니다.\n", &c);
printf("③문자형 포인터 cp의 값은 %c입니다.\n", *cp);
printf("④문자형 포인터 cp의 실제 주소는 %u입니다.\n", &cp);
printf("⑤문자형 포인터 cp의 참조 주소는 %u입니다.\n", cp);
printf("==================================================\n");
printf("⑥정수형 변수 i의 값은 %d입니다.\n", i);
printf("⑦정수형 변수 i의 주소는 %u입니다.\n", &i);
printf("⑧정수형 포인터 ip의 값은 %d입니다.\n", *ip);
printf("⑨정수형 포인터 ip의 실제 주소는 %u입니다.\n", &ip);
printf("⑩정수형 포인터 ip의 참조 주소는 %u입니다.\n", ip);
printf("==================================================\n");
printf("⑪실수형 변수 f의 값은 %f입니다.\n", f);
printf("⑫실수형 변수 f의 주소는 %u입니다.\n", &f);
printf("⑬실수형 포인터 fp의 값은 %f입니다.\n", *fp);
printf("⑭실수형 포인터 fp의 실제 주소는 %u입니다.\n", &fp);
printf("⑮실수형 포인터 fp의 참조 주소는 %u입니다.\n", fp);
printf("==================================================\n");
getch();
}
--출력 결과
==================================================
①문자형 변수 c의 값은 A입니다.
②문자형 변수 c의 주소는 1245052입니다.
③문자형 포인터 cp의 값은 A입니다.
④문자형 포인터 cp의 실제 주소는 1245040입니다.
⑤문자형 포인터 cp의 참조 주소는 1245052입니다.
==================================================
⑥정수형 변수 i의 값은 10입니다.
⑦정수형 변수 i의 주소는 1245048입니다.
⑧정수형 포인터 ip의 값은 10입니다.
⑨정수형 포인터 ip의 실제 주소는 1245036입니다.
⑩정수형 포인터 ip의 참조 주소는 1245048입니다.
==================================================
⑪실수형 변수 f의 값은 2.100000입니다.
⑫실수형 변수 f의 주소는 1245044입니다.
⑬실수형 포인터 fp의 값은 2.100000입니다.
⑭실수형 포인터 fp의 실제 주소는 1245032입니다.
⑮실수형 포인터 fp의 참조 주소는 1245044입니다.
==================================================
4. 포인터 변수의 이용
#include <stdio.h>
#include <conio.h>
void main() {
int i=20;
int *ip;
int *ip2;
ip = &i;
printf("ip : %u\n", ip); //1245052
printf("*ip : %d\n", *ip); //20
printf("i의 주소 : %u\n\n", &i); //5052
*ip = 50;
printf("*ip : %d\n", *ip); //50
printf("i의 주소 : %u\n", &i); //5052
printf("ip 포인터 변수 자체의 주소 : %u\n\n", &ip); //5048
ip2 = &i; //
*ip = 100;
printf("i의 값 : %d\n", i); //100
printf("ip2 : %u\n", ip2); //5052
printf("*ip : %d\n", *ip); //100
printf("*ip2 : %d\n", *ip2); //100
printf("ip2 포인터 변수 자체의 주소 : %u\n\n", &ip2); //5044
getch();
}