Upload
joao-pedro-melgaco-arantes
View
253
Download
2
Embed Size (px)
Citation preview
DONGEUIUNIVERSITY
Data structures
동의대학교 멀티미디어공학과 이광의교수
01.3: C++ pointers
Today’s topic 자료구조의 정의
► 정의 1: 자료구조는 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다 .
► 정의 2: 자료구조는 추상자료형이다 .► 정의 3: 자료구조는 잘 알려지고 유용한 추상자료형이다 .
C++ 클래스 : 추상자료형의 구현► 클래스 기초► 클래스 구현 예 1: 채널목록 추상자료형의 ( 정렬되지 않은 목록 ) 구현► 클래스 구현 예 2: 채널목록 추상자료형의 ( 채널이름 순으로 정렬된
목록 ) 구현
포인터► 포인터 기초► 포인터 활용 예 1
Dept. of Multimedia Engineering, DongEui Univ.(2)
Fundamentals of pointers 포인터 ( 포인터변수 ) 란 무엇인가 ?
► 메모리 번지를 저장할 수 있는 변수► 다른 변수의 위치를 저장할 수 있는 변수► 또 다른 정의
포인터는 왜 사용하는가 ?► 메모리를 동적으로 할당 받을 때► 매개변수가 변경되어 돌려지기를 원할 때► 이름 없는 변수의 사용► 또 다른 이유
Dept. of Multimedia Engineering, DongEui Univ.(3)
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예
void main ( ) { int a = 3; int *pa = &a; cout << a << “ ” << *pa << endl;
int arr[10]; arr[2] = 3; cout << arr[2] << endl;
int * prr; prr = new int[10] // int * prr = new int[10]; prr[2] = 3; cout << prr[2] << endl;}
Dept. of Multimedia Engineering, DongEui Univ.(4)
3pa a
[0]
[1]
3 [2]
[3]
[4]
arr
[0]
[1]
3 [2]
[3]
[4]
prr
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : 동적 기억장소 할당
void main ( ) { int n; cin >> n; // int arr[n] 오류 !!
int * prr = new int[n]; if (n>=3) { prr[2] = 4; cout << prr[2] << endl; }}
Dept. of Multimedia Engineering, DongEui Univ.(5)
[0]
[1]
4 [2]
[3]
[4]
prr
?prr
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by value 값에 의한 호출
void swap (int x, int y) { int tmp = x; x = y; y = tmp;}
void main ( ) { int a = 3; b = 4; ◀ swap (a, b); cout << a << “ ” << b << endl;}
Dept. of Multimedia Engineering, DongEui Univ.(6)
4 b3a
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by value 값에 의한 호출
void swap (int x, int y) { ◀ int tmp = x; x = y; y = tmp;}
void main ( ) { int a = 3; b = 4; swap (a, b); ◀ cout << a << “ ” << b << endl;}
Dept. of Multimedia Engineering, DongEui Univ.(7)
4 b3a
4 y3x
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by value 값에 의한 호출
void swap (int x, int y) { int tmp = x; ◀ x = y; ◀ y = tmp; ◀}
void main ( ) { int a = 3; b = 4; swap (a, b); ◀ cout << a << “ ” << b << endl;}
Dept. of Multimedia Engineering, DongEui Univ.(8)
4 b3a
4 >> 3 y3 >> 4x
3tmp
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by value 값에 의한 호출
void swap (int x, int y) { int tmp = x; x = y; y = tmp;}
void main ( ) { int a = 3; b = 4; swap (a, b); cout << a << “ ” << b << endl; ◀}// 출력은 3 4
Dept. of Multimedia Engineering, DongEui Univ.(9)
4 b3a
4 >> 3 y3 >> 4x
3tmp
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by reference 참조에 의한 호출
void swap (int *x, int *y) { int tmp = *x; *x = *y; *y = tmp;}
void main ( ) { int a = 3; b = 4; ◀ swap (&a, &b); cout << a << “ ” << b << endl;}// 출력은 4 3
Dept. of Multimedia Engineering, DongEui Univ.(10)
4 b3a
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by reference 참조에 의한 호출
void swap (int *x, int *y) { ◀ int tmp = *x; *x = *y; *y = tmp;}
void main ( ) { int a = 3; b = 4; swap (&a, &b); ◀ cout << a << “ ” << b << endl;}
Dept. of Multimedia Engineering, DongEui Univ.(11)
4 b3a
yx
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by reference 참조에 의한 호출
void swap (int *x, int *y) { int tmp = *x; ◀ *x = *y; ◀ *y = tmp; ◀}
void main ( ) { int a = 3; b = 4; swap (&a, &b); ◀ cout << a << “ ” << b << endl;}
Dept. of Multimedia Engineering, DongEui Univ.(12)
4 >> 3 b3 >> 4a
yx
3tmp
Fundamentals of pointers 포인터의 사용 예
► 단순변수의 포인터 활용 예 : call by reference 참조에 의한 호출
void swap (int *x, int *y) { int tmp = *x; *x = *y; *y = tmp;}
void main ( ) { int a = 3; b = 4; swap (&a, &b); cout << a << “ ” << b << endl; ◀}// 출력은 4 3
Dept. of Multimedia Engineering, DongEui Univ.(13)
4 >> 3 b3 >> 4a
yx
3tmp
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”);
◀ Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); } node3.nptr = ptr2;public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; int chn; cout << node3.nptr->nptr->chn << endl; string name; delete ptr1; class Node * nptr; node3.nptr->next = 0; ptr1=0;}; …
Dept. of Multimedia Engineering, DongEui Univ.(14)
0
동의 TV
14
(*ptr1).chn
(*ptr1).name
(*ptr1).nptr
ptr1
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”); Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); ◀ chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); } node3.nptr = ptr2;public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; int chn; cout << node3.nptr->nptr->chn << endl; string name; delete ptr1; class Node * nptr; node3.nptr->next = 0; ptr1=0;}; …
Dept. of Multimedia Engineering, DongEui Univ.(15)
0
동의 TV
14
0
CJ 홈쇼핑
2ptr1 ptr2
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”); Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); ◀ } node3.nptr = ptr2;public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; int chn; cout << node3.nptr->nptr->chn << endl; string name; delete ptr1; class Node * nptr; node3.nptr->next = 0; ptr1=0;}; …
Dept. of Multimedia Engineering, DongEui Univ.(16)
0
동의 TV
14
0
CJ 홈쇼핑
2
0
시네마 TV
7
node3
ptr1 ptr2
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”); Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); } node3.nptr = ptr2; ◀public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; int chn; cout << node3.nptr->nptr->chn << endl; string name; delete ptr1; class Node * nptr; node3.nptr->next = 0; ptr1=0;}; …
Dept. of Multimedia Engineering, DongEui Univ.(17)
0
동의 TV
14ptr1
0
CJ 홈쇼핑
2ptr2
시네마 TV
7
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”); Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); } node3.nptr = ptr2;public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1;
◀ int chn; cout << node3.nptr->nptr->chn << endl;
◀ string name; delete ptr1; class Node * nptr; node3.nptr->next = 0; ptr1=0;}; …
Dept. of Multimedia Engineering, DongEui Univ.(18)
0
동의 TV
14ptr1
CJ 홈쇼핑
2ptr2
시네마 TV
7
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”); Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); } node3.nptr = ptr2;public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; int chn; cout << node3.nptr->nptr->chn << endl; string name; delete ptr1; ◀ class Node * nptr; node3.nptr->next = 0; ptr1=0;}; …
Dept. of Multimedia Engineering, DongEui Univ.(19)
0
동의 TV
14ptr1
CJ 홈쇼핑
2ptr2
시네마 TV
7
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node 노드
class Node { …public: Node * ptr1 = new Node(14, “ 동의 TV”); Node(int nu, string na, Node *ptr=0) { Node * ptr2 = new Node(2, “CJ 홈쇼
핑” ); chn = nu; name = na; nptr = ptr; Node node3(7, “ 시네마 TV”); } node3.nptr = ptr2;public: ptr2->nptr = ptr1; // (*ptr2).nptr = ptr1; int chn; cout << node3.nptr->nptr->chn << endl; string name; delete ptr1; class Node * nptr; node3.nptr-> nptr = 0; ptr1=0; ◀★★★}; …
Dept. of Multimedia Engineering, DongEui Univ.(20)
0
동의 TV
140ptr1
0
CJ 홈쇼핑
2ptr2
시네마 TV
7
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst; ◀public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(21)
lst 0
lst.head
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); ◀ channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(22)
0
시네마 TV
7lst
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); ◀ string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(23)
0
시네마 TV
7lst
CJ 홈쇼핑
2
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); ◀ string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(24)
0
시네마 TV
7lst
CJ 홈쇼핑
2
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); ◀ void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(25)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); ◀ void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(26)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; ◀ void addCh (int nu, string na); cout << lst.chNameOf(7) << endl; ◀private: lst.delete Num(2); Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(27)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); ◀ Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(28)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); ◀ Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(29)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : node list 노드목록
class Node { … } … class channelList { // NodeList channelList lst;public: lst.addCh(7, “ 시네마 TV”); channelList ( ) { head = 0; }; lst.addCh(2, “CJ 홈쇼핑” ); string chNameOf (int nu); lst.addCh(14, “ 동의 TV”); void deleteNum (int nu); cout << “7: ”; void addCh (int nu, string na); cout << lst.chNameOf(7) << endl;private: lst.delete Num(2); ◀ Node * head; … };
Dept. of Multimedia Engineering, DongEui Univ.(30)
0
시네마 TV
7lst
동의 TV
14
node3
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : 함수의 구현 string chNameOf (int nu);
class Node { … } string chNameOf(int nu) {class channelList { // NodeList Node * ptr = head;public: while (ptr!=0) { channelList ( ) { head = 0; }; if (ptr->chn==nu) string chNameOf (int nu); retrun ptr->name; void deleteNum (int nu); ptr = ptr->nptr; ★★★ void addCh (int nu, string na); }private: return “ 채널없음” ; Node * head; }};
Dept. of Multimedia Engineering, DongEui Univ.(31)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
Another implementation of channel list
Dept. of Multimedia Engineering, DongEui Univ.(32)
0
시네마 TV
7lst
CJ 홈쇼핑
2
동의 TV
14
node3
포인터의 활용► 포인터 클래스 작성 : 함수의 구현 void deleteNum (int nu, string na);
class Node { … } void deleteNum (int nu) {class channelList { // NodeList if (head==0) return;public: if (head->nu==nu) { channelList ( ) { head = 0; }; Node *tmp = head; string chNameOf (int nu); head = head->nptr; void deleteNum (int nu); delete tmp; return; void addCh (int nu, string na); }private: Node ptr = head; Node * head; while (ptr->nptr!=0 && ptr->nptr->chn!=nu) {}; ptr = ptr->nptr;
} if (ptr->next==0) return; Node *tmp = ptr->nptr; ★★★ ptr->nptr = ptr->nptr->nptr; delete tmp;}
Another implementation of channel list 포인터의 활용
► 포인터 클래스 작성 : 함수의 구현 void addCh (int nu, string na);
class Node { … } string addCh (int nu, string na) {class channelList { // NodeList Node *ptr = new Node(nu, na);public: ptr->nptr = head; channelList ( ) { head = 0; }; head = ptr; string chNameOf (int nu); } void deleteNum (int nu); // string addCh (int nu, string na) { void addCh (int nu, string na); // head = new Node(nu, na, head);private: // } Node * head;};
Dept. of Multimedia Engineering, DongEui Univ.(33)
0
시네마 TV
7lst
CJ 홈쇼핑
2
node3
summaries 포인터
► 포인터 기초• 매개변수에 사용되는 포인터• 동적 메모리 할당
► 포인터 활용 예 1• 포인터에 기반한 채널목록의 또 다른 구현• 연결 리스트에서 노드 간의 연결에 활용되는 포인터
포인터를 자유자재로 쓸 수 있도록 연습합시다 .
Dept. of Multimedia Engineering, DongEui Univ.(34)
practice makes perfect!!!