1. 리트머스:
230313UG
참고: 코드는 의미가 있어야 합니다!
!
매 수업 시간에 랜덤으로 코드를 설명하는 시간이니 과제 제출 후 발표 시간 전에 코드를 숙지하세요.
2. 개념 + 예시:
힘내 링크: https://github.com/St2usy/Data_Structure_Study_3_week.git
바늘:
메모리의 모든 주소를 가리키는 변수입니다.
변수 크기는 4바이트(64비트 운영 체제의 경우 8바이트)로 고정됩니다.
포인터 변수 자체의 크기는 고정되어 있지만
정수*pt_int; 이러한 방식으로 int를 지정하는 이유는 포인터가 가리키는 메모리에 보관된 값의 유형이 int임을 나타내기 위해서입니다.
이중 포인터:
정수** pp_pt_int;
pp_pt_int = &pt_int;
위의 두 문장은 논리적으로 잘못된 문장입니다.
이중 포인터는 포인터에 대한 포인터입니다.
pt_int는 포인터 변수이므로 변수에 저장되는 값이 주소 값입니다.
이 경우 & 연산자는 포인터 변수의 메모리 주소를 참조하는 데 사용됩니다.
&pt_int의 타입이 int**가 되므로 pp_pt_int 값에 pt_int 값을 할당할 수 있다.
값에 의한 호출 / 참조에 의한 호출 / 포인터에 의한 호출:
함수의 매개 변수가 기본 변수, 참조 변수 또는 포인터 변수일 때 차이가 발생합니다.
기본 변수 -> 매개 변수 값이 복사되어 함수에 전달됩니다.
이때 원본과 사본이 구분되므로 사본의 값을 변경해도 원본의 값은 변경되지 않습니다.
참조 -> 매개변수 값은 참조의 형태로 함수에 전달됩니다.
원본과 참조가 가리키는 값은 같기 때문에 참조의 값을 변경하면 원본의 값도 변경됩니다.
포인터 변수 -> 유사 참조. 배열의 변수 이름을 전달해도 동일한 효과가 있습니다.
이는 배열의 변수명이 배열의 주소를 의미하기 때문입니다.
자체 참조 포인터:
동일한 클래스의 개체를 가리키는 멤버 변수 중 하나 이상의 포인터가 있는 클래스입니다.
특정 크기가 미리 할당된 배열과 달리 자기 참조 클래스가 정의되어 있고 요소의 개수를 미리 예측할 수 없는 경우 객체를 동적으로 생성하고 포인터로 연결하는 구조에서 자주 사용됩니다.
#pragma once
#include<string>
using std::string;
class Stack
{
struct Node
{
Node* prev;
string s;
Node(Node* prev, string s)
:prev(prev), s(s)
{}
};
Node* current; // 최상위값
Node start; // 최하위값
public:
Stack();
// 최상단에 새로운 원소를 추가한다.
void push(string s);
// 최상단의 원소를 제거하고 반환한다.
string pop();
// 최상단의 원소를 반환한다.
(제거 안함)
string peek();
// 스택이 비어있는지의 유무를 반환한다.
bool is_empty();
~Stack();
};
#include "STACK_MADE.h"
Stack::Stack()
:start(NULL, "")
{
current = &start;
}
void Stack::push(string s)
{
Node* n = new Node(current, s);
current = n;
}
string Stack::pop()
{
if (current == &start) // 최상단이 최하단과 같을때 <높이 1일때>
return "";
string s = current->s;
Node* prev = current;
current = current->prev;
// Delete popped node
delete prev;
return s;
}
string Stack::peek()
{
return current->s;
}
bool Stack::is_empty()
{
if (current == &start) return true;
return false;
}
Stack::~Stack()
{
while (current !
= &start)
{
Node* prev = current;
current = current->prev;
delete prev;
}
}
동적 매핑:
정적 할당에 대한 반대 개념으로 표준 변수 또는 배열이 정적 할당에 의해 선언될 때 스택에 메모리가 할당됩니다.
동적 할당은 힙에 메모리를 할당합니다.
필요한 메모리 크기는 런타임에 할당되고 사용자가 수동으로 할당하고 수동으로 할당을 해제합니다.
즉, 배열의 크기
입력된 변수를 통해 설정할 수 있습니다.
또한 동적으로 할당된 배열은 포인터의 이름과 인덱스로 일반 배열처럼 쉽게 사용할 수 있습니다.
void main() {
int arrA(20);
int* arrB = new int(20);
arrA(3) = 10;
arrB(3) = 20;
delete() arrB;
}
2차원 배열의 동적 할당:
결론을 말씀드리자면
int** arr2D = new int (행)(열); // 잘못된 코드입니다.
C++은 그런 편리한 기능을 제공하지 않습니다.
사전에 수동으로 행을 할당한 후
각 행에 열을 동적으로 할당해야 합니다.
즉, 루프를 실행하여 동적으로 행렬을 임의로 할당해야 합니다.
연결된 목록:
연결된 표현은 데이터와 링크로 구성되며 링크는 노드를 연결하는 역할을 합니다.
그러나 배열을 사용하기 때문에 데이터를 한 위치에 국한할 수 없습니다.
데이터가 무작위로 흩어져 있지만 링크를 사용하여 하나씩 추적하여 저장 공간을 확인할 수 있습니다.
연결 목록은 물리적으로 분산된 데이터(메모리에 무작위로 분산됨)를 연결하고 해당 데이터를 단일 데이터로 그룹화하는 방법입니다.
1. 크기의 가변성
2. 간편한 메모리 삽입 및 삭제
노드, 헤드 포인터