[c++] Pointer and Dynamic Arrays

파이톨치·2022년 5월 3일
0

대학수업

목록 보기
5/32

Pointing to

포인터는 익히 알고 있는 개념이다. 포인터는 주소값을 값으로 가지는 변수이다. 주소값을 저장해주어야 하기 때문에 & 연산자를 사용한다. 예를 들어 어떤 변수를 가리킬 때는 다음과 같이 사용한다.

int *p, v;
p = &v;

이렇게 하면 p는 변수 v를 가리키게 된다.

& Operator

& 연산자를 주소값을 주는 연산자이다.

const Money operator +(const Moneyt& amount1, const Money& amount2);

Call by value Pointers

만약 함수가 포인터의 파라미터를 변경하면 로컬 변수만 바뀌는게 아니라 원래 있던 값까지 바뀌게 된다.

new Operator

포인터 변수를 참조한다. 하지만 꼭 실제 변수일 필요는 없다. 동적으로 할당된 변수여도 된다는 이야기 이다. 어떻게 하냐고 묻는다면 new를 쓰면 된다!

p1 = new int;

요런식으로 써주게 되면 이름 없는 변수를 만들어서 p1이 가리키게 만든 것이다.

More on new Operator

MyClass *myPtr;
mcPtr = new Myclass(32.0, 17);

// similar to 
int *n;
n = new int(17);

이런 식으로 클래스에 대해서도 선언이 된다. 얘는 힙에 할당되는 것이다.

Future "new" operations will fail if heap is "full"

메모리 관리를 해야하는 이유는 메모리가 한정되어 있기 때문이다.

그래서 메모리를 제거해주어야 한다.

int *p;
p = new int(5);

delete p;

Dangling pointer (허상포인터)

delete를 해주어도 p가 거기에 남아 있을 수 있다. 그래서 만약 같은 이름의 포인터를 선언하면 프로그램에서 예상치 못한 값을 얻을 수 있다. 때문에 다음과 같은 작업을 해준다고 한다.

delete p;
p = NULL;

Memory (Variable) allocation

지금까지 계속 했던 이야기가 메모리에 관한 이야기였다. 때문에 메모리에 대해 좀 더 깊게 알아보자.

Static allocation

For static/global variables

The space is allocated once, when a program started

Automatic allocation

– Happens when automatic variables (local variables, parameters) declared

Not dynamic:
• Created when function is called
• Destroyed when function call completes
• Created/Destroyed when a block statement with variable declaration is entered/exited

Dynamic allocation

  • Program determines to create/destroy memory allocation at runtime
  • Through new/delete operations

이런식으로 메모리가 구성되어 있다. 부가적인 내용이니 깊게 알지 않아도 될 것 같다.

Arrays

그렇다면 이 개념을 array에 적용해보자.

먼저 배열의 이름의 경우 포인터로 간주하기도 한다. C언어를 할 때 익히 배운 내용이니 까먹지 말고 기억하도록 하자.

우선 자동적으로 선언되는 배열 변수는 고정된 사이즈를 가지고 있다. 때문에 동적인 배열을 사용하기도 한다.

동적 배열

Dynamic arrays: Can grow and shrink as needed

typedef double * DoublePtr;
DoublePtr d;
d = new double[10];

이런식으로 하면 동적인 배열이 생성된다. typedef 는 double *를 쓰기 귀찮아서 typedef로 한 것이다.

Deleting Dynamic Arrays

얘는 deleting을 조금 신기하게 한다.

d = new double[10];

delete [] d;

배열을 반환하는 함수

int [] someFunc(); // 잘못된 반환 값이다.

int* someFunc(); // 올바른 반환 값이다. 

Back to Classes

화살표 연산자

작년에 배웠는데 까먹었다. 화살표 연산자를 사용하면 불필요하게 지저분한 코드를 안 써도 된다. 예시 코드를 살펴보자.

MyClass *p;
p = new MyClass;

// equvalent 
(*p).grade = "a";
p->grade = "a";

아래 두 줄의 코드는 같은 의미이다.

this 포인터

this를 처음 봤을 때는 이게 뭐지? 했다. 하지만 생각해보니가 파이썬에도 비슷한 것이 있었다. 바로 self이다. 클래스를 만들 때 self를 사용하면 내가 만든 클래스 자신을 가리켰다. 이것도 비슷한 친구이다. 파이썬에서 self.변수이름 과 같이 사용했고 여기서도 this->변수이름과 같이 사용한다.

과제랑 나머지 내용을 내일 해야지~

profile
안알랴줌

0개의 댓글