포인터는 앞에서 설명한 것과 같이 메인 메모리 상의 주소의 위치를 가리키고 있다.
포인터를 이용하여 프로그램이 실행되는 동안 이름이 없는 메모리를 할당할 수 있다.
c언어에선느 malloc()과 같은 함수를 이용하여 메모리를 할당할 수 잇따.
c++에서도 malloc()함수를 사용할 수 있지만 여기서는 new연산자를 사용해보자.
typeName *pointerName = new typeName;
할당할 메모리의 종류를 지정하여 new 연산자를 사용하여 new 연산자는 알맞은 크기의 메모리 공간을 확보한 후 해당 공간의 메모리 주소를 반환한다.
이 주소를 포인터 변수에 대입하여 새롭게 확보한 메모리 공간을 사용할 수 있다.
예를 들어 int형 데이터를 저장할 메모리 공간을 할당받아 사용하기 위해 다음과 같이 한다.
int *p_var = new int;
new연산자는 int형에 맞는 메모리 공간을 할당한 후 해당 주소를 리턴한다.
이 주소가 포인터 변수인 p_var에 저장되고 이후 p_var를 통해 해당 주소에 접근할 수 있다.
new를 통해 할당한 메모리는 사용후 delete연산자를 사용하여 반환한다. 위에서 할당한 메모리는 다음과 같이 해제한다.
delete p_var
메모리를 할당 해제 하지 않을 경우 메모리 누수가 발생하여 프로그래밍 제대로 동작하지 않을 수 있다.
*메모리 누수 : https://www.ibm.com/docs/ko/aix/7.1?topic=performance-memory-leaking-programs
new연산자를 사용하여 동적 배열을 생성할 수 있다.
int *p_arr = new int[10]; <- 1차원 배열 동적 할당
new연산자는 동적 배열의 메모리를 할당하고 해당 배열의 시작 주소를 반환한다.
동적 배열을 해제하는 방법은 다음과 같다.
delete [ ] p_arr;
이제 동적 메모리와 동적 배열을 생성하여 사용하는 예제를 실행시켜 보고 메모리 공간에 접근하는 방법을 연습해보자.
포인터 변수에 1을 더하면 포인터가 지시하는 데이터형의 바이트 수만큼 값이 증가한다.
실습 예제 2-13 :
#include <iostream>
int main(void) {
using namespace std;
int* p_var = new int;
double* p_arr = new double[3];
*p_var = 1001;//동적할당을 한 변수에 정수를 집어넣는다.
p_arr[0] = 20000.644456465;//동적 할당을 한 배열에 실수를 집어넣는다.
p_arr[1] = 0.5546;//동적 할당을 한 배열에 실수를 집어넣는다.
p_arr[2] = 10000001.0000000;//동적 할당을 한 배열에 실수를 집어넣는다.
cout << "값: " << *p_var << endl;//동적할당을 한 실수 변수의 값을 출력한다.
cout << "주소: " << p_var << endl;//동적할당은 포인터 변수를 이용하므로(포인터변수에 할당한 메모리 주소를 집어넣는다. 포인터 변수이름은 있지만, 변수의 이름은 없다.)
cout << "사이즈?: " << sizeof(p_var) << endl;//동적 할당을 한 배열의 주솟값이 담긴 포인터 변수의 크기를(바이트 수)를 출력한다.
cout << "사이즈?: " << sizeof(*p_var) << endl;//뭘까이게
cout << "\n";
for (int i=0;i<3;i++)
cout << "p_arr["<<i <<"] : " << p_arr[i] << endl;
cout << "\n오리지널\n";
cout << "p_arr= " << p_arr << ", *p_arr = " << *p_arr << endl;
cout << "\np_arr+1을 하고 난 후\n";
p_arr = p_arr + 1;
cout << "p_arr= " << p_arr << ", *p_arr = " << *p_arr << endl;
cout << "p_arr[0] = " << p_arr[0] << ", p_arr[1] = " << p_arr[1] << endl;
cout << "*p_arr=" << *p_arr << ", *(p_arr+1) = " << *(p_arr + 1) << endl;
cout << "\np_arr-1을 하고 난 후\n";
p_arr = p_arr - 1;
cout << "p_arr= " << p_arr << ", *p_arr = " << *p_arr << endl;
cout << "p_arr[0] = " << p_arr[0] << ", p_arr[1] = " << p_arr[1] << endl;
cout << "*p_arr = " << *p_arr << ", *(p_arr+1) = " << *(p_arr + 1) << endl;
delete p_var;
delete [] p_arr;
return 0;
}
ㄴ실수의 표준출력 : https://yoonjunho.tistory.com/140
2차원 배열 동적 할당
int **arr =new int*[ROW];
for(int i=0; i<ROW;i++){
arr[i]=new int[COL];
}
**C++ 변수로 크기 받아서 2차원 배열 선언
->그냥 INT N으로 한다음에 arr[n][n]해도 되는데, 그러면 내 컴에서는 되는데, 백준에서는 컴파일 에러가 난다.
const int n으로 한 다음에 arr[n][n]이렇게 해야한다.
책 : 이게 진짜 c++프로그램이다 61p.
'c++' 카테고리의 다른 글
20. [C++] 객체 배열 (0) | 2023.01.20 |
---|---|
19. [C++] 생성자와 소멸자 (0) | 2023.01.20 |
1-3 [C++] 실수 표준출력 (0) | 2023.01.15 |
10. [C++] 포인터와 배열 (0) | 2023.01.15 |
9. [C++] 포인터 (0) | 2023.01.15 |