C++ 포인터 - 동적 할당

진경천·2023년 9월 12일
0

C++

목록 보기
18/90

정적변수 static

기존의 지역 변수는 자동 주기를 가지며 정의되는 시점에서 생성되고 초기화되며 정의된 블록이 끝나는 지점에서 소멸한다.
하지만 정적 지역 변수는 주기가 자동 주기에서 정적 주기로 바뀌며 생성된 스코프(=범위, 블럭)이 종료된 이후에도 해당 값을 유지한다.
또한, 정적 변수는 한번만 초기화 되며 프로그램 수명 내내 지속된다.

#include <iostream>

void incrementAndPrint()
{
    static int s_value = 1; // 'static' 키워드를 사용한 '정적 생명 주기'
    						//  이 줄은 한번만 실행된다.
    ++s_value;
    std::cout << s_value << '\n';
} // s_value는 여기서 소멸되지 않지만, 접근할 수 없게된다.

int main()
{
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
    
    return 0;
}

-실행 결과

2
3
4

결과를 보면 메인 함수 바깥에서 선언된 s_value가 블록을 벗어났어도 값이 초기화 되지 않고 유지되는 것을 알 수 있다.

동적 메모리 할당

C언어의 malloc()과 달리 자료형* 변수 = new 자료형 으로 선언하여 동적 메모리를 할당한다.
C언어의 동적 메모리와 같이 사용 후에는 해제를 해줘야 하는데 이때는 free()가 아닌 delete 변수의 형태로 해제를 한다.

#include <iostream>

using namespace std;

int main() {
	
	int* pNum0 = new int(123);
	int* pNum1 = pNum0;

	cout << *pNum1 << endl;
	delete pNum0;

	// cout << *pNum0 << endl; 메모리 해제 이후에는 사용할 때 문제가 있다.

	int s = 10;
	int* arr = new int[s];
	// 배열의 길이를 상수가 아니라도 표현 가능

	arr[0] = 1;
	cout << arr[0] << endl;

	delete[] arr;
	// 배열을 동적할당 하고 해제를 할 때는 delete[]를 이용한다.

	return 0;
}
  • 코드 실행 결과

    123
    1

구조체 동적 할당

구조체는 맴버 변수가 여러개 들어 있기에 변수를 일일이 선언하기보다는 포인터에 메모리를 할당해 사용하는 편이 효율적이다.
기존 구조체에서는 변수.변수로 값을 저장하거나 지정했지만
포인터에서는 -> 연산자를 이용한다.

#include <iostream>

using namespace std;

struct Person {
	float weight;
	float height;
};

int main() {
	
	Person* person = new Person{ 74.34f, 182.3f };

	cout << (*person).height << endl;	//(*변수).변수로 표현하는 것이 원형임.
	cout << person->height << endl;		//->로 대체 가능

	Person* persons[2] = {
		new Person{12.2f, 190.2f},
		new Person{153.12f, 142.11f}
	};

	cout << endl;

	for (Person* person0 : persons)		// person0는 주소값
		person0->weight = 0.0f;
	for (Person* person0 : persons)
		cout << person0->weight << endl;
        
    delete person

	return 0;
}
  • 코드 실행 결과

    182.3
    182.3

    0
    0

profile
어중이떠중이

0개의 댓글