Contents

조회 수 11418 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

레퍼런스(References)

레퍼런스는 자동적으로 역참조되는 포인터라고 할 수 있다. 자동적 역참조(automatically dereferenced)라는 것은 레퍼런스의 값을 얻기 위해 역참조 연산자 *를 사용할 필요가 없음을 의미한다. 레퍼런스는 다른 변수를 위한 별명(aliases)을 만든다.

int i = 20; //일반 정수형 변수

int *ip = &i; // 정수형에 대한 포인터

int & ir = i; // 정수형에 대한 레퍼런스

레퍼런스를 정의 하기 위해 주소 연산자, &를 사용한다.

레퍼런스를 초기화하지 않고 레퍼런스를 정의해서는 않된다. ir은 현재 i의 별명이고 ir에 행해지는 것은 역으로 i에 행해진다.

ir = 10; // i의 값이 10이 된다.

ip

.....

ir-i-

10

예제

레퍼런스 변수의 정의

#include

#include

#include

void main(){

void *vp;

int i = 20;

int & ir = i;

clrscr();

cout << ir << endl;

ir=10;

cout << i << endl;

i=50;

cout << ir << endl;

getch();

}


레퍼런스는 함수간 매개변수 전달 시 강력한 힘을 발휘한다.

상수에 대한 포인트

int i=10;

const int *ip = &i;

ip는 const int에 대한 포인트이다. 그러므로 ip의 내용은 수정할 수가 없다.

아래의 예제를 보자.

예제

상수에 대한 포인트

#include

#include

#include

void main(){

int i = 20;

const int * ip= &i ;

clrscr();

cout << *ip << endl;

*ip=10; // 에러발생 (cannot modify a const object)

cout << *ip << endl;

getch();

}


상수 포인트는 일반변수를 상수처럼 다루도록 요구하여 접근을 제한할 때 사용한다.

포인트 상수

int i = 20;

int * const ip = &i;

ip 가 const형임을 의미한다. 즉 ip를 바꿀 수 없다. 그러나 ip의 내용은 바꿀 수 있다.

예제

포인트 상수

#include

#include

#include

void main(){

int i = 20, j =10 ;

int * const ip= &i ;

clrscr();

cout << *ip << endl;

*ip=j; // ip의 내용은 바꿀 수 있다.

cout << *ip << endl;

ip = &j; // 에러발생 (cannot modify a const object)

getch();

}


읽기 전용 레퍼런스

int i = 25;

const int & r = i;

r은 상수에 대한 레퍼런스이다. 따라서 r로써 i의 값을 변경할 수 었다.

r=30; // 에러 발생

하지만 i에 직접 값을 바꿀 수는 있다.

i=30;

r은 읽기 전용이다.

혼자 해보기

배열의 각 요소에 12개월의 날짜를 가진 정수 배열을 초기화하는 프로그램을 작성해 보자. 배열을 정의하고 초기화한 다음, 배열의 첫 번째 요소를 가리키는 포인터 상수를 생성하자. 배열의 이름을 사용하지 말고 포인터 상수를 사용해서 배열의 요소를 출력하는 루프를 작성해 보자.

메모리 동적 할당

동적(dynamic)이란 말은 변화를 의미하는데, 동적 메모리 할당(dynamic memory allocation)은 메모리를 할당하고 해제할 때 힙의 크기가 변하는 것을 말한다.

메모리

MS-DOS

Turbo C++

프로그램

프로그램 변수 힙

남겨진

메모리

힙은 남겨진 메모리이다.

메모리 힙을 위한 new

힙에 정수를 하나 할당하자.

int * a = new int;

new라는 키워드는 힙을 사용하라는 의미이다. 힙에 int 만큼 메모리를 잡아서 변수 a가 가리키도록 한다.

물론 하나의 변수를 힙에 할당하는 것은 그렇게 좋은 것은 아니다. 다음과 같이 보통 배열을 할당할 때 사용한다.

int *a = new int[100];

예제

Heap에 배열할당하고 초기화하기

#include

#include

#include

void main(){

int *arr = new int[10]; // 메모리 할당

clrscr();

for(int i = 0; i < 10; i++){ //초기화

*(arr+i) = i*2;

}

for(i = 0; i < 10; i++){ // 출력

cout << *(arr+i) << endl;

}

getch();

}


delete으로 메모리 해제하기

new로 메모리를 할당하면 delete으로 해제한다.

메모리를 반납하여 다른 자원이 이 메모리를 쓸 수 있도록 한다.

delete a; // 메모리를 힙에 돌려줌

다음 문장은 new로 할당된 메모리의 배열을 해제한다.

delete [] arr; // 힙으로부터 배열을 해제한다.

예제

delete으로 메모리 해제

#include

#include

#include

void main(){

int *arr=new int[10];

clrscr();

for(int i=0;i<10;i++){

*(arr+i)=i*2;

}

for(i=0;i<10;i++){

cout << *(arr+i)<

}

delete [] arr; // 메모리 해제

getch();

}


detete arr; 으로 하면 배열의 첫 번째 요소만 해제하므로 주의해야 한다.

다차원 배열

int (*arr) [6] = new int[5][6]; // (* arr) arr이 포인트라는 것이다.

int (*arr2)[5][6]= new int[4][5][6];

첫 번째 차원은 명시하지 않으며 두 번째 차원은 배열의 첫 번째 차원의 각 요소들을 위해 6개의 요소를 갖는다.

delete [] arr; // []가 하나 뿐임을 주시하자.

delete [] arr2;

메모리를 해제한다.

예제

2차원 배열 메모리 할당 및 해제

#include

#include

#include

void main(){

int (*arr)[6] = new int[5][6]; // 할당

clrscr();

for(int i = 0;i < 5;i++) // 초기화

for(int j = 0;j < 6;j++)

*(*(arr + i) + j) = i + j;

for(i = 0;i < 5;i++){ // 출력

for(j = 0;j < 6;j++)

cout << setw(5) << arr[i][j];

cout << endl;

}

delete [] arr; // 해제

getch();

}




?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
721 Develop [c++] Win32API를 이용한 ExitWindowsEx 사용한 예제코드 hooni 2013.04.23 7948
720 Develop [c++] Window API(MFC) 오목 게임 file hooni 2003.04.23 10275
719 Develop [c++] WinSock2.0 채팅 프로그램 ㅋㅋ file hooni 2013.04.23 8519
718 Develop [c++] winsock을 이용한 서버,클라이언트와 ssl서버,클라이언트 file hooni 2013.04.23 7602
717 Develop [c++] 가짜 인증서(하나은행) 프로그램 file hooni 2013.04.23 10746
716 Develop [c++] 기초강좌 #01(입출력,영역지정) hooni 2003.04.23 11396
» Develop [c++] 기초강좌 #02(레퍼런스,메모리할당) hooni 2003.04.23 11418
714 Develop [c++] 기초강좌 #03(함수의 매개변수 전달) hooni 2003.04.23 12072
713 Develop [c++] 기초강좌 #04(클래스) hooni 2003.04.23 11822
712 Develop [c++] 더블 링크리스트(linked list) 학습용 초간단 단어장 file hooni 2003.04.23 9323
711 Develop [c++] 데이터 압축 프로그램 소스 (lzw) file hooni 2013.04.23 9933
710 Develop [c++] 디렉토리 내의 파일 찾기 FindFirstFile() 함수 6 hooni 2013.04.23 20564
Board Pagination Prev 1 ... 6 7 8 9 10 11 12 13 14 15 ... 71 Next
/ 71