노력과 삽질 퇴적물

포인터 & 이중포인터 & 인수 본문

프로그래밍note/언어. C&C++ 계열

포인터 & 이중포인터 & 인수

알 수 없는 사용자 2011. 7. 10. 21:15

포인터.

&일반_변수명  = 일반_변수명;
*포인터_변수명 = &일반_변수명;

  일반_변수명 == *포인터_변수명 == 내용물
&일반_변수명 ==   포인터_변수명 == 주소값

주소값 참조값
   &arr[row][col]
    arr[row] + col
   *arr + n

//[*]는 간접연산자
//n = row + col 
   *(arr[row] + col)
   *(*arr + n)
   *(*(arr + row) + col)
    (*(arr + row))[col]

//n = row + col


② 구조체 포인터

구조체 참조 인수 구조체 포인터 인수
   반환타입 함수명(구조체명 &태그명)
   {
      ...
      태그명.멤버1;
      태그명.멤버2;
      ...
   } 
   반환타입 함수명(구조체명 *태그명)
   {
      ...
      태그명->멤버1; //화살표 연산자
      태그명->멤버2;
      ...
   }






int a = 2000;
int   *   ptr = &a;     //   ptr == 일반_변수a 내용물
int **d_ptr = &ptr;   // d_ptr == 포인터_변수ptr 주소값

     *ptr => a의 내용물
 *d_ptr => ptr주소값
**d_ptr => ptr에 저장된 주소와 연결된 내용물

                  == a의 내용물

연상법.

> 보물의 위치[주소값]를 알고 있는 비밀요원[포인터_변수]에게 총[*]를 들이밀면 보물의 정체[변수의 값]를 알려준다.

> 고급 비밀요원[이중_포인터_변수]은 비밀요원의 주소를 알고 있다.

  고급 비밀요원에게 총[*]을 들이밀면 비밀요원도 알고 있는 보물의 위치[주소값]를 말하나,

  쌍권총[**]을 들이밀면 보물의 정체[내용물]을 알려준다.


객체 인수 객체 포인터 인수 객체 참조인수(only CPP)
반환타입 함수명(클래스명 태그명);

int main()
{
     클래스명 태그명n;
     반환타입 함수명(태그명n);
     ...
}

반환타입 함수명(클래스명 태그)
{
     ...
     태그명.멤버1;
     태그명.멤버2;
     ...
}
반환타입 함수명(클래스명 *태그명);

int main()
{
     클래스명 태그명n;
     반환타입 함수명(*태그명n);
     ...
}

반환타입 함수명(클래스명 *태그명)
{
     ...
     태그명->멤버1;
     태그명->멤버2;
     ...
}
반환타입 함수명(클래스명 &태그명);

int main()
{
     클래스명 태그명n;
     반환타입 함수명(&태그명n);
     ...
}

반환타입 함수명(클래스명 &태그명)
{
     ...
     태그명.멤버1;
     태그명.멤버2;
     ...
}

주요 용도.

> 포인터 변수의 주소값 접근 및 변경이 가능.





void 포인터.
-> 포인터가 가르키는곳의 내용물을 읽는 역참조 사용불가.
-> 데이터형이 없으므로 연산처리불가.






-> 다른 포인터는 데이터를 가리키지만 함수 포인터는 코드를 가리킨다.

-> 라이브러리를 만들때, 그래픽 보드에 상관없이 라이브러리 사용 가능.

-> 참고자료: 함수 포인터 타입(구, winAPI)



선언

캐스팅

float div(int n1, int n2)

{

float result = (float)(n1 / n2);


return result;

}

float (*func_ptr) (int, int); //인수가 int형이고 반환타입이 float인 함수를 가르킨다.

func_ptr = div; //func_ptr = sigma();는 에러

함수 포인터끼리도 캐스팅이 가능하다.

변환법은

   float (*func_ptr) (int, int)

↓ 변수명 삭제

   float (*) (int, int)

↓ 전체를 괄호로 묶기

   (float (*) (int, int))  반환타입_다른_함수_포인터_변수명







-> 참고자료: Joinc: 다양한 포인터 활용 예제들

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
typedef struct CustomeNode
{
    int *head;
    char body_name[10];
    int body_num;
    char *memo;
}Node;
Node  node1;
Node  node2;
Node *pt_n = &node2;
 
 
void main()
{
    int val_1 = 10;
    int val_2 = 10;
    int *pt = &val_1;
    int **d_pt = &pt;
 
    cout << "   val_1 = 10  /        *pt = &val_1  /  **d_pt = &pt" << endl;
    cout << "   val_1=" << val_1 << ",    &val_1=" << &val_1 << ",    val_2=" << val_2 << ",    &val_2=" << &val_2 << endl;
    cout << "  pt=" << pt << ",    &pt=" << &pt << ",    *pt=" << *pt << endl;
    cout << "d_pt=" << d_pt << ",    &d_pt=" << &d_pt << ",    *d_pt=" << *d_pt << ",    **d_pt=" << **d_pt << endl;
    /*
        ptr  == a의 주소값   /    d_ptr == ptr의 주소값
        *ptr == a의 내용물   /   *d_ptr == ptr 내용물
        **d_ptr == ptr에 저장된 주소값의 내용물[*ptr]
                == a의 내용물
        간접연산자(*)를 붙이면 주소값에 있는 내용물로 대응
    */
 
    cout << "----------tagNode1----------" << endl;
    node1 = {&val_1, "node1"0""};/*순서 맞출것.*/
    node1.body_num = 111;
    cout << "head=" << node1.head << ", body_name=" << node1.body_name << ", body_num=" << node1.body_num << ", memo=" << node1.memo << endl;
 
    cout << "----------tagNode2----------" << endl;
    node2 = node1;
    //*pt_n = &n2;    /*    이미 선언했으니 생략되는 부분.    */
    //n2.body_name = "node2";    //에러발생
    (*pt_n).head = &val_2; //pt_n->head = &val_2;
    pt_n->body_num = 222;//n2.body_num = 222;//
    pt_n->memo = new char[50];// (char *)malloc(50);
    strcpy_s(pt_n->memo, 50"node1_copy");
    cout << "head=" << pt_n->head << ", body_name=" << pt_n->body_name << ", body_num=" << pt_n->body_num << ", memo=" << pt_n->memo << endl;
 
    cout << "PRESS TO ANY KEY" << endl;
    _getch();//화면에 반환하진 않음. //conio.h 필요
}
cs






기타. 변경이력


일자

변경이력

2011-07-10

 초안.

2015-12-08

 '심화' 추가
 연상법. 추가