Definition of Pointer
: 주소를 저장하는 변수
Pointer = point + ~er (지시자)
Point == address
4byte -> 주소를 저장하는 변수
기능 4가지
1
2
3
4
모양꼴
가리키는 타입 *변수명;
cf. 함수는 코드영역에 잡힌다
그 이름을 알아야 호출을 할 수 있다
ㆍ 주소 1. &변수명 2. 배열명 3. 함수명 4. 문자열 5. 포인터 |
#4. 문자열
C++에서는 헤더파일 <String.h> 하면 String 클래스를 쓰는 거다
#include <string.h> : 문자열 관련 함수들이 모여있는 함수 라이브러리
근데 C에서 썼던 String 헤더파일을 쓰고싶다
그럴 땐 #include <cstring> 을 붙여라!
#include <string.h> 는 클래스를 갖다쓰는거고
#include <cstring> 함수를 갖다쓰는 거다!
Facilities of Pointer
포인터의 4가지 기능은 다음과 같다.
ㆍ 포인터의 4가지 기능 1. 포인터는 오직 주소만 받을 수 있다. 2. 받은 주소의 값을 알 수 있다. 3. 받은 주소의 값을 변경할 수 있다. 4. 주소 이동이 가능하다. |
#1. 주소를 받지 않으면 일하지 말란 얘기야
항상 정확한 주소를 계산할 줄 알아야 한다!
1번을 하지 않으면 그 이후는 진행하지 마라!
#4. 포인터의 가장 좋은 점은 1:1방식 이라는 것!
동시에 잡지 못하지만,
ex. int a = 10;
int *p; : 나는 포인터야; int를 가리키는
포인터는 간접변수이기 때문에 항상 읽을 때 '가리키는'을 붙이는 습관을 들여라!
&p : 포인터가 가리키는 주소값
p : 포인터가 가리키는 값
*p : 포인터 자신의 주소
*p = &a; 일때
p를 읽을 땐 p가 '가리키는' 주소값 ==> a의 주소
Address Expression
주소 표현식은 다음과 같다.
ㆍ 주소 표현식(Address Expression) 1. 포인터는 오직 주소만 받을 수 있다. 2. 받은 주소의 값을 알 수 있다. 3. 받은 주소의 값을 변경할 수 있다. 4. 주소 이동이 가능하다. |
1.
2.
3. 이 세번째를 하기 위해서 1번, 2번이 존재한다
4. [] *를 바꿔서 호환할 수 있다
★중요한 건, 본래 의미는 바뀌지 않는다!
포인터는 될 수 있으면 움직이지 않는 것이 좋다
휘발성(volatileness)이 있는 포인터들은 움직이면서 하고 아닌 것들은 위처럼 하는 것이 좋다
Dynamic Memory Allocation
: 런타임 시 임의적으로 힙 영역에 메모리를 할당하고 해제할 수 있는 제도
new / delete
ex. int *p = new int; // 할당하는 순간에 포인터가 잡아야 한다!
delete p;
int *pp = new int[10];
delete []pp;
int *p;
p = new int[3];
cf. in C : (int *)malloc(sizeof(int));
위의 new는 연산자다!
c++에서 연산자의 의미는 중요하다!
연산자로도 함수를 만들수 있다(operator function)
delete p;
※ 1개 해제할 때랑 3개 해제할 때랑 방식이 다르다!
delete []p;
delete p; 해도 에러는 나지 않는다. 다만 좀비 프로세스가 존재하게 된다.
항상 기억!
int *p = new int[1]; // 1개를 할당할 때도 꼭 이렇게 하자
소멸자는 1개밖에 없기 때문에 1개의 형식만 쓸 수 있다 (delete[]p;) 하기위함
http://corock.tistory.com/74 참고
Right-Left Rule
1. right
2. left
1. 정체 파악
2. 용도 파악
ex.
1. int *p[3];
1. [3] (배열)
2. int *(용도)
==> "포인터 배열"
왜 쓰냐? -> 배열을 쓰는 이유? -> 포인터의 일괄처리를 하기 위해서(떨어져 있는 메모리를 일괄처리하기 위해서)
2. int (*p)[3];
1. *
2. int [3];
=> 한 행당 요소를 3개 가지고 있는 2차원 배열을 가리키겠다는 뜻
3. int **p;
※ 한번 읽은 건 절대 또 읽으면 안된다!
Program
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream> using namespace std; void main() { // declaration int a[2][3] = { 6, 5, 4, 3, 2, 1 }; int i, j; int(*p)[3]; // initialization p = a; for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { cout << a[i][j]<< "\t" << p[i][j] << "\n"; cout << *(a[i] + j) << "\t" << *(p[i] + j) << "\n"; cout << *(*(a + i) + j) << "\t" << *(*(p + i) + j) << "\n"; } cout << endl; } } | cs |
레퍼런스의 특징
한번 지정하면 바꿀 수 없기 때문에 명확하다