포인터와 메모리 해제
#include <iostream>
using namespace std;
int main() {
int z = 6;
int* y;
y = &z;
cout << "z의 값" << z << endl;
cout << "*y의 값" << *y << endl;
cout << "z의 주소" << &z << endl;
cout << "*y의 주소" << y << endl;
*y = *y + 1;
cout << "이제 z의 값은 " << z << endl;
//C++ : 객체지향 프로그래밍
/*
컴파일 시간이 아닌 실행 시간에 어떠한 결정을 내릴 수 있다.
- 배열 생성
재래적 절차적 프로그래밍 : 배열의 크기가 미리 결정
객체지향 프로그래밍 : 배열의 크기를 실행 시간 결정
==>값이 변할 수 있는 변수로 배열의 크기를 결정할 수 있다.
*/
//포인터 : 사용할 주소에 이름을 붙인다.
// 즉, 포인터는 포인터의 이름이 주소를 나타냅니다.
//간접값 연산자, 간점 참조 연산자 *
int * a; //c 스타일
int* b; //c++ 스타일
int* c, d; // 여러개의 변수를 나열해서 선언하면 c는 포인터 변수, d는 int형 변수
return 0;
}
포인터로 선언된 값을 확인하기 위해서는
간접 참조자 *을 붙이면 되고
주소를 확인하려면 그냥 변수를 입력하면 된다.
*y=*y+1;
하여도 z값이 증가되는 것을 알 수 있다.
포인터 앞에 선언되있는 자료형은
포인터가 가리키는 자료형의 자료형이다.
포인터와 메모리 해제(2)
#include <iostream>
using namespace std;
int main() {
//new 연산자
/*
어떤 데이터형을 원하는지 new 연산자에게 알려주면,
new 연산자는 그에 알맞는 크기의 메모리 블록을
찾아내고 그 블록의 주소를 리턴합니다.
*/
int a;
int* b = &a;
//b를 통해서도 a의 주소를 통해서도 접근
int* pointer = new int; //int형 데이터를 지정할 수 있는 새로운 메모리가 필요하다고 알려주는것
//new 연산자가 int형이 몇 바이트가 필요한지 계산하고 해당하는 데이터를 저장할 수 있는 메모리 블록을
//찾아서 그 주소를 pointer에게 리턴해서 초기화 시켜주는것
//포인터 변수 하나만 int형 값에 접근할 수 있는 유일한 방법
//지시하는 메모리의 이름이 없는데 메모리에 어떻게 접근하는가?
//포인터가 데이터의 객체를 지시하고 있다고 표현한다.
//메모리 제어권을 사용자에게 줄 수 있다는 큰 장점이 있다.
//필요할 때 new를 사용해서 메모리를 대입하는것은 c++의 강력한 장점이다.
delete pointer; //프로그램에 메모리를 해제 한다.
//반드시 대입 후에 반환시켜줘야 한다.
//new로 대입하지 않은 메모리는 delete로 해제할 수 없다.
//같은 메모리 블록을 연달아 두 번 delete로 해제할 수 없다.
//new[]로 메모리를 대입할 경우 delete[]로 해제한다.
//대괄호를 사용하지 않았다면 delete도 대괄호를 사용하지 않아야 한다.
return 0;
}
배열로 선언했을 때
#include <iostream>
int main()
{
using namespace std;
double* p3 = new double[3];//double 형 데이터 3개를 저장할 수 있는 공간을 대입한다.
p3[0] = 0.2; //p3를 배열 이름처럼 취급한다.
p3[1] = 0.5;
p3[2] = 0.8;
cout << "p3[1] is " << p3[1] << ".\n";
p3 = p3 + 1; // 포인터를 증가시킨다.
cout << "Now p3[0] is " << p3[0] << " and ";
cout << "p3[1] is " << p3[1] << ".\n";
p3 = p3 - 1; // 다시 시작 위치를 지시한다.
delete[] p3; // 배열 메모리를 해제한다.
return 0;
}
배열의 값을 더하는 행위는 double형 데이터 공간 한 개를 의미하는 것이다.
포인터 연산
#include <iostream>
#define SIZE 20
using namespace std;
int main(){
char animal[SIZE];
char* ps;
cout << "동물 이름을 입력하십시오.\n";
cin >> animal;
ps = new char[strlen(animal) +1];
strcpy(ps, animal);
cout << "입력하신 동물 이름을 복사하였습니다." << endl;
cout << "입력하신 동물 이름은 " << animal << "이고, 그 주소는 " << (int*)animal << " 입니다." << endl;
cout << "복사된 동물 이름은 " << ps << "이고, 그 주소는 " << (int*)ps << " 입니다." << endl;
delete[] ps;
return 0;
}
복사된 값이 원래 값과 다른것을 알 수 있다.
실행시간에 배열의 크기를 결정할 수 있는것이다.
ps = new char[strlen(animal) +1];
위의 코드를 보면 animail 변수의 크기보다 +1 크게 해서 ps를 설정한 후에
animal을 저장하고 출력한것을 확인 할 수 있다.
동적 구조체
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#define SIZE 20
using namespace std;
//동적 구조체 생성
//temp* ps = new temp;
//동적 구조체의 멤버 변수 접근을 위해서 ->를 사용해야 한다.
//->를 사용하지 않고 (*temp). 을 통해서도 접근할 수 있다.
struct MyStruct
{
char name[20];
int age;
};
int main() {
MyStruct* temp = new MyStruct;
cout << "당신의 이름을 입력하십시오.\n";
cin >> temp->name;
cout << "당신의 나이를 입력하십시오.\n";
cin >> (*temp).age;
cout << "안녕하세요! " << temp->name << "씨!\n";
cout << "당신은 " << temp->age << "살 이군요!\n";
delete temp;
return 0;
}
'[C++]코딩연습장' 카테고리의 다른 글
C++ [분할컴파일] (0) | 2021.02.22 |
---|---|
C++ [참조 변수] [함수 템플릿] (0) | 2021.02.21 |
C++ [Function] (0) | 2021.02.21 |
C++ [구조체] (0) | 2021.02.21 |
C++ [Hello, World!] (0) | 2021.02.21 |