[c++] 포인터
- 컴퓨터공학과/Programming
- 2013. 11. 29.
포인터
▶ 함수로부터 배열 반환
♡ 다음 중 옳은 구문은?
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;
: 원 메모리 공간을 가리키는 포인터가 사라졌으므로 접근할 수 없는 상태가 된다. 이 메모리는 접근할 수도 없고 삭제할 수도 없게 됨
'컴퓨터공학과 > Programming' 카테고리의 다른 글
[Android] R 클래스 에러 - R.java 파일 삭제 후 재생성되지 않을 경우 해결방법 (0) | 2013.12.03 |
---|---|
[c++] 객체와 클래스 (0) | 2013.11.30 |
[Android] 초보자도 할 수 있다! 안드로이드 자동 가위바위보 게임앱 만들기! (7) | 2013.10.09 |
[c++] 함수 (0) | 2013.10.09 |
[JSP] 개발환경구축 - ⑤ JSP 프로그래밍 (0) | 2012.07.15 |