Contents

조회 수 11420 댓글 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
번호 분류 제목 글쓴이 날짜 조회 수
» Develop [c++] 기초강좌 #02(레퍼런스,메모리할당) hooni 2003.04.23 11420
752 Develop [c++] 기초강좌 #01(입출력,영역지정) hooni 2003.04.23 11398
751 Develop [c++] mfc 조건별 파일 검색 프로그램 소스 ㅋㅋ 19 file hooni 2013.04.23 11389
750 Develop [switch] 시스코 카탈리스트(Cisco Catalyst) 2950 미러링 설정 hooni 2013.04.23 11386
749 System/OS [linux] GD 라이브러리 설치 방법.. file hooni 2013.04.23 11362
748 System/OS [linux] vi 편집기 간단한 명령과 환경설정 hooni 2003.04.23 11358
747 Develop [js] 인터넷 주소(URL) 인코딩 ㅋㅋ hooni 2013.04.23 11347
746 Develop [spring] 스프링 IoC/DI hooni 2013.04.23 11345
745 System/OS [linux] iptables 명령어 매뉴얼(options) hooni 2003.04.23 11327
744 Develop [js] 한글주소(URL) 인코딩(encode, Encoding), 자바스크립트(JavaScript) hooni 2013.04.23 11324
743 Develop [switch] 시스코 스위치(catalyst 2950) telnet 설정 hooni 2013.04.23 11268
742 Develop [ios] iOS In App Purchase 코드 부분 샘플 2 hooni 2013.11.20 11266
Board Pagination Prev 1 ... 31 32 33 34 35 36 37 38 39 40 ... 98 Next
/ 98