[c++] 포인터

포인터

 

▶ 함수로부터 배열 반환

 

다음 중 옳은 구문은?

int[] reverse(const int list[],int size)                          (X)

void reverse(cons tint list[], int newList[], int size)     (O)

 

함수에서 배열을 반환할 수는 없어요!

>>> 포인터 : 컴퓨터 메모리 직접 조작 가능

 

포인터 변수(포인터) : 데이터 값의 메모리 번지를 가짐

일반적인 변수 : 데이터 값(정수, 실수, 문자)를 가지고 있음

 

dataType *pVarName;

 

포인터 변수를 선언할 때 : 변수 앞에 *(애스터리스크)

포인터에 변수의 번지 대입 : 변수 앞에 &(앰퍼샌드-주소 연산자) => 변수의 번지

 

int *pCount;

int count = 5;

pCount = &count;

>>>> int count = 5;

int *pCount = &count;

 

★★★★★ *pCount = &count (X)

★★★★★ &count / pCount / count / *pCount 의 의미

 

* 애스터리스크

1. 곱셉 연산자

double area = radius * radius * PI;

2. 포인터 변수 선언 시

int *pCount = &count;

3. 간접 참조 연산자

(*pCount)++;

 

포인터 변수의 유형

: int, double 등 포인터의 유형과 기억되는 번지의 유형이 서로 다르면 오류!

항상 포인터를 초기화 하자!

 

함수로 인수를 전달하는 방법

1) Call-by-value(=pass-by-value)

2) Call-by-reference

3) 포인터 참조에 의한 전달

 

배열이름 : 배열이 시작되는 번지 의미

간접 참조 연산자를 사용하여 배열의 각 요소를 사용하여 접근하는 것이 가능함!

 

list[] = *(list + ) = *(+ list) = [list]

list[0] = list

list[1] = *(list + 1)

 

                  list                                 list+1                                list+2

*(list)

*(list + 1)

*(list+2)

 


 

list + 1 => 첫번째 주소 + 1 * sizeof(int)

list + 2 => 첫번째 주소 + 2 * sizeof(int)

 

★★★★★ list / list+1 / *(list+1) / list[1] / *list+1 의 의미

 

@ 배열 - 포인터

배열은 실제로 포인터로 볼 수 있음

포인터와 인덱스 변수를 함께 사용해도 됨

 

int list[4] = {11, 12, 13, 14};

int *pList = list; // int *pList = &list; (X - 배열이름 자체가 배열시작번지이므로)

// int *pList = &list[0] (O)

 

>>> *(list+1) / list[1] / *(pList+1) / pList[1]

 

배열은 포인터로 사용될 수도 있고, 포인터도 배열로 사용될 수 있음

차이점: 배열은 한 번 선언되면 그 번지를 변경할 수 없음(상수 포인터!!)

int list1[10], list2[10];

list1 = list2;

상수 포인터 - 포인터에서도 상수로 선언 될 수 있음

 

double radius =5;

double *const pValue = &radius;

상수포인터는 선언과 초기화가 같이 이루어져야 함

상수포인터가 한 번 선언되고 나면 새로운 번지를 기억시킬 수 없음

가리키는 데이터는 상수가 아니기 때문에 데이터는 변경할 수 있음!!

> 상수도 변경 불가능하게 하려면?

double radius = 5;

double length = 5;

double *const pvalue = &radius;

*pValue = 6; (O)

pValue = &length; (X)

 

함수에서 포인터를 매개변수로 사용할 수 있지! 그러면 함수의 반환 값으로 포인터를 사용할 수 있을까?

ㅇㅇ 쓸 수 있어요!

int * reverse(int const *list, const int size)

지역변수는 함수가 반환되고 나면 메모리가 유지되지 않고 스택에서 사라지게 된다! => pop!

 

>> 동적 메모리 할당!

★★★★★★★★★

동적 메모리 할당 기능을 사용하면 지속 가능한 메모리를 동적으로 할당할 수 있음

메모리는 new 연산자를 사용하여 생성함

 

int *pValue = new int;

>> 컴퓨터 실행 시에 int 변수 크기의 메모리를 할당하도록 요청함

할당된 변수의 주소는 pValue 포인터에 기억됨 -> 포인터를 통해 메모리 접근 가능

 

int *list = new int[10]

>> 컴퓨터 실행 시에 10개의 요소를 가지는 int 배열 크기의 메모리를 할당하도록 요청, 배열 주소는 list에 할당됨

 

new 연산자를 통해 생성되는 메모리는 힙이라는 메모리 영역에 작성됨

>> 프로그램이 끝날 때까지 사라지지 않고 유지됨 -> 함수 후에도 사용 가능

배열의 크기에 변수를 사용할 수 있음 (일반적인 배열의 크기는 변수 사용불가였지)

new 연산자에 의해 생성된 메모리를 명시적으로 해제하기 위해서는 delete 키워드 사용

delete pValue;

delete[] list;

 

메모리 누수

int *pValue = new int;

*pValue = 45;

pValue = new int;

: 원 메모리 공간을 가리키는 포인터가 사라졌으므로 접근할 수 없는 상태가 된다. 이 메모리는 접근할 수도 없고 삭제할 수도 없게 됨

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️