학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

포인터

학습목표

포인터를 익혀서 메모리를 효율적으로 사용한다.

학습주제

포인터란 데이터의 메모리 번지를 가르킨다는 뜻이다. 메모리 번지를 직접 콘트롤 함으로써 데이터를 신속하고 효율적으로 과니 있다. C에서 가장 중요한 부분으로 자세히 공부해야 한다.

예습내용

1. 포인터의 선언

데이터형 *포인터변수

 

 

2. 포인터 변수의 초기화

데이터형 *포인터변수=&번지

 

 

예제1

포인터 변수의 선언과 초기화

#include <stdio.h>

int main(int argc, char* argv[])

{

              int a=100;

              int *b;                 // 포인터 선언

 

              printf("%d %d\n",a,&a);

              b = &a;               // 포인터 변수 초기화-a 메모리 번지를 포인터 b 저장

              printf("%d %d\n",*b,b);

              return 0;

}

100 1245052

100 1245052

일반 변수 a 번지수를 포인터 b 저장한다. 그리고 *b 번지에 저장된 값을 나타낸다.

변수

a

&a

포인터

*b

b

100

1245052

 

3. 1차원 배열과 포인터

1차원 배열의 초기 번지를 포인터로 넘긴다.

예제2

함수에서 1차원 배열을 포인터 받는다.

#include "stdafx.h"

#include "iostream.h"

 

void Print(int *in);

 

int main(int argc, char* argv[])

{

              int a[3]={1,2,3},i;

              int *b;

 

              b = &a[0];

              for(i=0;i<3;i++) {

                             cout<<*b<<" "<<b<<endl;

                             b++;

              }

              cout<<"============="<<endl;

              Print(&a[0]);       // 초기 번지를 넘긴다.

              return 0;

}

 

void Print(int *in)            // 포인터로 받는다.

{

              int i;

 

              for(i=0;i<3;i++)

                             cout<<*in++<<" "<<in<<endl;

}

1 0x0012FF74

2 0x0012FF78

3 0x0012FF7C

=============

1 0x0012FF74

2 0x0012FF78

3 0x0012FF7C

위에서 변수 a 포인터 in 번지수가 같음을 있다.

 

4. 2차원 배열과 포인터

예제3

함수에서 2차원 배열을 포인터 받는다.

#include "stdafx.h"

#include "iostream.h"

 

void Print(int *in);

 

int main(int argc, char* argv[])

{

              int i,c[3][3]={{1,2,3},{4,5,6},{7,8,9}};

              int *b;

 

              b = &c[0][0];

              for(i=0;i<9;i++) {

                             cout<<*b<<" "<<b<<endl;

                             b++;

              }

 

              cout<<"============="<<endl;

              Print(&c[0][0]);

              return 0;

}

 

void Print(int *in)

{

              int i;

 

              for(i=0;i<9;i++)

                             cout<<*in++<<" "<<in<<endl;

}

1 0x0012FF58

2 0x0012FF5C

3 0x0012FF60

4 0x0012FF64

5 0x0012FF68

6 0x0012FF6C

7 0x0012FF70

8 0x0012FF74

9 0x0012FF78

=============

1 0x0012FF58

2 0x0012FF5C

3 0x0012FF60

4 0x0012FF64

5 0x0012FF68

6 0x0012FF6C

7 0x0012FF70

8 0x0012FF74

9 0x0012FF78

2차원 배열도 일차원으로 저장 된다는 것은 앞에 설명했다. 그러므로 2차원 이상의 배열은 초기 번지와 ,열의 개수를 함수에 전달하면 차례로 값을 읽어서 참조하면 된다. 다음은 완성된 프로그램으로 2차원 이상은 이와 같이 프로그램을 만들면 된다.

예제4

함수에서 2차원 배열을 포인터를 이용해 또다른 번지의 배열로 받는다.

#include "stdafx.h"

#include "iostream.h"

 

void Print(int *in, int r, int c);

 

int main(int argc, char* argv[])

{

              int i,j,a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

              int *b;

 

              b = &a[0][0];

              for(i=0;i<3;i++)

                             for(j=0;j<3;j++)

                                           cout<<a[i][j]<<" "<<&a[i][j]<<endl;

             

              cout<<"============="<<endl;

              Print(&a[0][0],3,3);

              return 0;

}

 

void Print(int *in, int r, int c)

{

              int i,j,out[3][3];

 

              for(i=0;i<r;i++)

                             for(j=0;j<3;j++) {

                                           out[i][j]=*in;

                                           in++;

                             }

              for(i=0;i<c;i++)

                             for(j=0;j<3;j++)

                                           cout<<out[i][j]<<" "<<&out[i][j]<<endl;

}

1 0x0012FF54

2 0x0012FF58

3 0x0012FF5C

4 0x0012FF60

5 0x0012FF64

6 0x0012FF68

7 0x0012FF6C

8 0x0012FF70

9 0x0012FF74

=============

1 0x0012FEC4

2 0x0012FEC8

3 0x0012FECC

4 0x0012FED0

5 0x0012FED4

6 0x0012FED8

7 0x0012FEDC

8 0x0012FEE0

9 0x0012FEE4

실습방법

   

 

 

처음

   

 

중요함수