본문 바로가기

Contact English

【C++】 2강. 포인터

 

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