[C++]코딩연습장

C++ [포인터와 메모리 해제] [포인터 연산] [동적 구조체]

KAU 2021. 2. 21. 16:21


포인터와 메모리 해제 

#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