2강. 포인터(pointer)
추천글 : 【C++】 C++ 목차
1. 포인터 변수 [본문]
2. 참조 변수 [본문]
3. 객체와 포인터 [본문]
4. 포인터와 행렬 [본문]
a. GitHub
1. 포인터 변수(pointer variable) [목차]
⑴ 개요
① 포인터(pointer) : 다른 객체의 주소의 값을 저장하고 있는 객체
② 중요성 1. 프로그램에 명령어 인자를 전달하는 메커니즘 : return by reference와 관련
③ 중요성 2. 동적객체에 필요함
○ 동적객체 : 프로그램이 실행되는 도중에 메모리가 할당되는 객체
○ 함수가 메모리를 할당받은 뒤 함수가 종료돼도 동적객체는 살아있음
○ 응용 1. 동적객체는 각 element의 크기가 일정하지 않은 배열을 만들 때
○ 응용 2. 프로그램이 실행되는 중에 이미 선언된 변수를 동적으로 변경시킬 때
⑵ 포인터 변수의 선언
int *p; // p is a pointer to an int
char *s; // s is a pointer to a char
int i = 1;
char c = 'y';
int *q = &i; // q is a pointer to int i
char *t = &c; // t is a pointer to a char c
⑶ (출제 예상) 포인터 변수의 크기는 컴파일러 설정에 따라 다름
① 16 bit 컴파일러의 경우 2 byte
② 32 bit 컴파일러의 경우 4 byte
③ 64 bit 컴파일러의 경우 8 byte
④ double*, int*, char* 등 자료형에 따라 다른 것은 아님
⑷ dereference operator (*) : 포인터 변수가 가리키는 주소값에 저장된 변수의 값을 반환함
① std::cout << *mystring << endl; // "Pizza"
② "."이 "*"보다 먼저 수행되기 때문에 (*foo).area();와 같이 써야 함
③ *의 위치는 중요하지 않음
std::string food = "Pizza";
std::string* mystring = &food; // recommended
std::string *mystring = &food;
std::string * mystring = &food;
④ multiple pointer declaration
char *str1, *str2;
⑸ 예제
① 포인터를 이용하여 값을 바꾸는 경우
int i = 1;
int *p = &i; // p indicates to i
*p = 2;
std::cout << i << std::endl; // 2
② & 연산자를 통해 포인터 주소를 바꾸는 경우
int i = 1;
int j = 2;
int *p;
p = &i; // p points to location of i
*p = 234; // contents of i are updated
p = &j; // p points to location of j
*p = 56; // contents of j are updated
std::cout << i << " " << j << std::endl; // 234 56
③ 객체에 간접적으로 접근하는 경우
Member m(1);
Member *p = &m;
(*m).sayHello(); // invokes sayHello() of the object
m->sayHello(); // invokes sayHello() of the object
⑺ 키워드 1. nullptr
① 포인터 변수가 가리키는 주소가 0의 값을 가지는 경우
② 그 포인터 변수는 어떤 값도 호출할 수 없음
⑻ 키워드 2. new와 delete
① new : heap space에 메모리를 할당하고 그 메모리의 포인터를 반환하는 명령어
② int* ptr = new int;
③ delete : 포인터가 가리키는 할당된 메모리를 삭제함
④ new를 쓰지 않으면 stack에 저장되고 delete를 꼭 하지 않아도 됨 : 예를 들어 Rectangle obj(3, 4);
⑤ (참고) delete를 제대로 하지 않아 발생한 버그를 디버깅하는 건 굉장히 어려움
⑥ (주석) 즉, new를 쓰면 heap에 저장되므로 프로그래머가 책임지고 delete를 해야 함
⑼ 키워드 3. const
① (참고) C++에서 const는 final과 유사함
② 포인터 변수인 경우 : const 위치에 따라 의미가 다름
const Object* obj; // can't change data (value)
Object* const obj; // can't change pointer (address)
const Object* const obj; // can't change data or pointer
○ class의 member들이 바뀌지 않을 것임을 표시한 것
○ member의 값을 바꾸려고 할 경우 compile error를 띄워서 코딩 실수를 방지함
○ (참고) java의 final의 경우 variable은 비슷한 개념이지만, method는 override가 안됨을 표시한 거라 차이가 있음
○ (주석) pointer에 있어서 const의 대상은 거꾸로 이해해야 하는 느낌
2. 참조 변수(reference variable) [목차]
⑴ 참조 변수의 선언
① std::string &my_house = myhome;
② std::string* my_house = &myhome;
⑵ 포인터 변수와 참조 변수의 등가성
① 개요
○ 일반적으로 포인터 변수와 참조 변수는 완벽하게 동일함
○ 참조 변수의 도입 목적 : 참조 변수는 변수처럼 쓸 수 있지만 포인터 변수는 값을 바꿀 때 *를 써야 되서 번거로움
② 차이 1. 포인터 변수는 가리키는 주솟값을 바꿀 수 있지만 참조 변수는 주솟값을 바꿀 수 없음
③ 차이 2. 포인터 변수는 "->"를 써서 member에 접근하는 반면, 참조 변수는 "."를 써서 member에 접근
④ 차이 3. 포인터 변수는 선언과 초기화가 동시에 진행될 필요는 없지만 참조 변수는 선언 시에 bound돼야 함 (ref)
⑶ reference operator (&) : 주소값을 return 함
3. 객체와 포인터 [목차]
⑴ 경우 1. regular type
① primitive type을 정의하듯이 정의
② "."을 이용해 member variable, member function에 접근함
⑵ 경우 2. reference type
① *, new를 이용해서 정의
② 포인터 객체의 경우 "."을 쓰지 못하므로 "->"을 대신 사용함
4. 포인터와 행렬 [목차]
⑴ 포인터와 1차원 행렬
int* arr = new int[10];
⑵ 포인터와 2차원 행렬 (ref)
① 방법 1. int** array = new int[10][5]; // won’t work!
② 방법 2. int (*array)[5] = new int[10][5]; // only constant size
③ 방법 3. auto array = new int[10][5]; // only constant size. from C++ 11
④ 방법 4.
int** array = new int*[10];
for (int count = 0; count < 10; ++count)
array[count] = new int[5];
for (int count = 0; count < 10; ++count)
delete[] array[count];
delete[] array;
입력: 2020.11.21 17:59
'▶ 자연과학 > ▷ C, C++' 카테고리의 다른 글
【C++】 4강. OOP 2부 (0) | 2020.12.01 |
---|---|
【C++】 3강. OOP 1부 (0) | 2020.11.21 |
【C++】 1강. C++ 시작하기 (0) | 2020.11.18 |
【코딩】 C 언어로 이항계수 (0) | 2016.06.27 |
【코딩】 C 언어로 콜라츠의 추측 (0) | 2016.06.27 |
최근댓글