본 자료는 국립 창원대학교 메카트로닉스 공학부 학생을 대상으로 한 컴퓨터 언어 응용 수업 자료입니다. 본 자료는 수업의 교재인 (핵심요약판) C++로 시작하는 객체지향 프로그래밍 (Y. Daniel Liang 저, 권기형 / 김응성 공역) 의 내용을 재구성한 것으로 수업보조 자료 이외의 목적이 없음을 알립니다.






포인터 변수
포인터변수, 줄여서 포인터라고 하는 것은 주소값을 저장하는 변수를 말합니다.

 
위와 같이 (*) 기로를 사용해서 포인터임을 선언하는데요. 포인터변수는 주소값을 저장하긴하지만, 그 주소값에 저장되어있는 변수의 데이터형으로 포인터의 데이터를 저장해야합니다. 이유는 포이터변수는 엄밀히 말하면 시작되는 주소값만을 저장하는 것이기 때문이지요. 그러니 데이터 유형을 알아야 끝낼수 있거든요...

<코드1>
#include <iostream>
using namespace std;

int main()
{
  int count = 5;
  int *pCount = &count;

  cout << "The address of count is " << &count << endl;
  cout << "The address of count is " << pCount << endl;
  cout << "The value of count is " << count << endl;
  cout << "The value of count is " << *pCount << endl;

  return 0;
}

 
위 코드를 보면, 포인터의 의미는 확실히 알 수 있는데요. count라는 변수에 5를 저장하구요. pCount라는 포인터변수에 count의 주소값을 저장합니다. 그걸 cout으로 출력해서 확인해 보았네요.


배열도 일종의 포인터라고 할 수 있는데요. 배열을 선언하면 위에서처럼 저장된다고 볼 수 있는데요.

<코드2>
#include <iostream>
using namespace std;

int main()
{
  int list[6] = {11, 12, 13, 14, 15, 16};
  int *pList = &list[0];

  for (int i = 0; i < 6; i++)
    cout << "address: " << (list + i) << " value: " << *(list + i) << " " << " value: " << list[i] << " " << " value: " << *(pList + i) << " " << " value: " << pList[i] << endl;

  return 0;
}


위 예제에서는 배열(list)을 선언하고, 각 저장공간의 주소와 그 내용을 볼때, 그냥 *(list+i)로 불러본것과 list[i]로 불러본 것등의 역활이 같음을 보여줍니다.









예제
이 예제는 포인터를 이용해서 배열을 역수로 변형시키는데요. 6번행의 문법에 주의하셔야합니다. new 연산자를 사용해서 함수외부로 변수를 전달하고 있거든요.

<코드 3> 
#include <iostream>
using namespace std;

int * reverse(const int * list, int size)
{
  int *result = new int[size];

  for (int i = 0, j = size - 1; i < size; i++, j--)
  {
    result[j] = list[i];
  }

  return result;
}

void printArray(const int *list, int size)
{
  for (int i = 0; i < size; i++)
    cout << list[i] << " ";
}

int main()
{
  int list[] = {1, 2, 3, 4, 5, 6};
  int *pList = reverse(list, 6);
  printArray(pList, 6);

  return 0;
}

 
<코드 4>
#include <iostream>
using namespace std;
int Max(int *num,int *counts );
int main()
{
    int num[]={8,54, 11,-45,43,26,66,12,33, 65};
    int n=sizeof(num)/sizeof(int);
    cout<<"*counts 값: "<<n<<"    주소: "<<&n<<endl;
    cout<<"최대값 :"<<Max(num, &n)<<endl;  //&n <-- 주소를 넘긴다. 
    cout<<"\n----------------------------"<<endl;
    system("PAUSE");       //기다림
    return EXIT_SUCCESS;   //EXIT_SUCCESS    0 
 }
 //&n을  counts로 받는다. counts 주소에 있는 값--> *counts 
 int Max(int *num,int *counts ){  
     cout<<"*counts 값: "<<*counts<<"    주소: " <<&counts<<"  != 참조주소: "<<counts<<endl;
     int max=num[0]; 
     for(int i=1;i<*counts;i++){
             if(num[i]>max){
                   max=num[i];
             }          
     }
    return max;     
 }

 
이 예제는 포인터를 사용해서 배열의 최대값을 찾아보는 것입니다.



참고자료

[2009] 07.pdf




http://pinkwink.kr/trackback/205 관련글 쓰기
  • 에스페란토 2010/01/04 03:33

    포인터 변수가 시작되는 주소값만 저장한다는 것이 무슨뜻입니까?
    저장되는 데이터의 첫번째 요소의 주소만 저장한다는 뜻인가요?

    • PinkWink 2010/01/04 06:05

      포인터는 데이터의 첫 주소만 가집니다.
      그래서 포인터도 데이터 유형을 선언해야합니다.

      int로 선언된 데이터 a가 있을때
      포인터로 a를 잡을려면 그 포인터변수도 int로 선언해야만 합니다. 이유는 첫 주소값만을 저장하기 때문이지요. 그래서 자신의 데이터 유형을 알고 end point를 알게 됩니다.

  • mdfs 2012/03/10 18:30

    큰 제목에 오타가 있네요..

  • ㅇㅇㅇ 2012/09/25 09:22

    int iostrms321win32,iostrms321win64m,*i32,*i64;
    i32=&iostrms321win32;
    i64=&iostrms321win64m;
    이러개 정의 하고 사용 하면 좋와요
    printf("%d %d",*i32,*I64);
    포인터와 비스한 참조 가있는데 이개좀 개륵 이에요??
    int iostrms321win32,iostrms321win64m,*i32,*i64;
    편집기가좀 이상하내요?? 왜이래???

    • PinkWink 2012/09/25 14:22

      댓글 편집기는 좀 기능이 없죠.. ㅎㅎ
      그래도 또한 댓글에 감사드립니다.