노력과 삽질 퇴적물
포인터 & 이중포인터 & 인수 본문
포인터.
일반_변수명 == *포인터_변수명 == 내용물
주소값 | 참조값 |
&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; ... } |
== a의 내용물
연상법.
> 보물의 위치[주소값]를 알고 있는 비밀요원[포인터_변수]에게 총[*]를 들이밀면 보물의 정체[변수의 값]를 알려준다.
> 고급 비밀요원[이중_포인터_변수]은 비밀요원의 주소를 알고 있다.
고급 비밀요원에게 총[*]을 들이밀면 비밀요원도 알고 있는 보물의 위치[주소값]를 말하나,
쌍권총[**]을 들이밀면 보물의 정체[내용물]을 알려준다.
객체 인수 | 객체 포인터 인수 | 객체 참조인수(only CPP) |
반환타입 함수명(클래스명 태그명); int main() { 클래스명 태그명n; 반환타입 함수명(태그명n); ... } 반환타입 함수명(클래스명 태그명) { ... 태그명.멤버1; 태그명.멤버2; ... } |
반환타입 함수명(클래스명 *태그명); int main() { 클래스명 태그명n; 반환타입 함수명(*태그명n); ... } 반환타입 함수명(클래스명 *태그명) { ... 태그명->멤버1; 태그명->멤버2; ... } |
반환타입 함수명(클래스명 &태그명); int main() { 클래스명 태그명n; 반환타입 함수명(&태그명n); ... } 반환타입 함수명(클래스명 &태그명) { ... 태그명.멤버1; 태그명.멤버2; ... } |
주요 용도.
> 포인터 변수의 주소값 접근 및 변경이 가능.
-> 다른 포인터는 데이터를 가리키지만 함수 포인터는 코드를 가리킨다.
-> 라이브러리를 만들때, 그래픽 보드에 상관없이 라이브러리 사용 가능.
-> 참고자료: 함수 포인터 타입(구, 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 | '심화' 추가 연상법. 추가 |
'📂기초 및 세팅 note > 언어. C&C++ 계열' 카테고리의 다른 글
전역변수, 지역변수, 정적변수, 동적변수 (0) | 2011.07.22 |
---|---|
구조체 & 클래스 & 공용체 & 열거형 (0) | 2011.07.14 |
CPP: VS2008 솔루션과 프로젝트 (0) | 2011.07.05 |
main()함수의 유형 (0) | 2011.05.13 |
CPP: 기초적인 함수원형, 정의, 반환에 대한 예시 (0) | 2011.05.13 |