▩ 포인터(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();

 }

Posted by 나비:D
:
BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :