2016년 3월 12일 토요일

C++ 공부 2 - 참조자(Reference),new&delete

CF) C언어 복습 const, 메모리 공간

1. const 키워드

const int num = 10;

- num 값 변경 불가!
 
const int* p = #
 
- 상수형 정수의 주소를 저장하겠다의 의미
- *p = 20 (에러), p = &num2 (ok)

int* const p = #
 
- 정수의 주소를 저장하는 상수형 포인터의 의미
- *p = 20 (ok), p = &num2 (에러)
 
const int* const p = #
 
- 상수형 정수의 주소를 저장하는 상수형 포인터의 의미
- *p = 20 (에러), p = &num2 (에러)
 
2. 실행중인 프로그램의 메모리 공간
- 실행중인 프로그램은 운영체제로부터 RAM에 메모리 공간을 할당 받음.
 
1. 데이터 전역변수 및 static 변수가 저장되는 공간
- 프로그램의 시작시 할당, 프로그램이 종료시 소멸
2. 스택 - 함수 내의 지역변수 및 매개변수가 저장되는 공간
- 함수 호출이 완료되면 사라짐
3. 힙 - 필요에 의한 동적메모리 할당을 위한 공간
 
 
chap2. C언어 기반의 C++ 2
 
1. 자료형 bool
 
bool isTrue1 = true;
bool isTrue2 = false;
 
- true, false0,1 과는 구분되는 독립적인 값임.
 
2. 참조자(reference)

- 변수 : 할당된 메모리 공간에 붙여진 이름.
 
int *p = &num1; //변수 num1의 주소를 포인터에 저장해라
int &num2 = num1; //변수 num1에 새로운 참조자 num2를 선언해라
 
- &이 이미 선언된 변수 앞에오면, 주소를 반환하지만,
- 새로 선언되는 변수이름 앞에 오면, 참조자(reference,별칭)을 선언함.
 
int &num2; (에러) , int &num2 = 20; (에러)
 
- 변수에 대해서만 선언가능하며, 선언됨과 동시에 누군가를 참조해야함.
int num = 12;
int *p1 = #
int **p2 = &p1;
 
int &r1 = num;
int *(&r2) = p1;
int **(&r3) = p2;
 
- pointer 변수 역시 reference 선언 가능.
 
3. 참조자(reference)를 이용한 call-by-reference
void swap1(int *p1,int *p2)
       int temp = *p1;
       *p1 = *p2 ;
       *p2 = temp;
}
 
void swap1(int &p1,int &p2)
       int temp = p1;
       p1 = p2 ;
       p2 = temp;
}
//인자로 초기화하겠다 의미이므로 사용가능
 
- call-by-reference 에는 2가지 방식(주소값, 참조자)이 존재함
포인터는 잘못 사용할 확률이 높고, 참조자의 활용이 더 쉬움.
그러나 포인터를 고수하는 사람들도 많음. 결론: 둘다 알아야함.
 
void Happy(const int &num){ . . . . . }
 
- 함수내에서, 참조자를 통한 값의 변경을 하지 않을 경우, const 사용하 여 함수의 원형만 봐도 값의 변경이 이루어지지 않음을 알릴 것.
 
4. 반환형이 참조형(reference type)인 경우
 
int& Plusoneref(int &ref){
      ref++;
      return ref; //함수 종료시 지역변수 ref는 사라짐에 유의!
}
 
- 함수 호출1 : int &num1 = Plusoneref(num);
- numnum1은 동일한 메모리 공간을 나타내는 변수.

- 함수 호출2 : int num2 = Plusoneref(num);
- numnum2는 다른 메모리 공간을 나타내는 변수.
 
5. const 참조자와 함수의 호출
 
int Adder(const int &num1, const int &num2){
      return num1+num2;
}
 
Adder(3,4); // 가능.
const int &num = 50; //가능
- 상수화된 변수(const)의 경우 값을 직접 지정가능.
- const 사용시 임시로 변수를 만들어 참조하기 때문.
 
CF) C언어 복습 포인터를 이용한 배열의 접근

1. 1차원 배열 1차원 포인터변수로 접근
 
int num[3] = {10,20,30};
int *p = num;
 
- 이 경우 p[i]num[i]처럼 사용 가능
- *(p+i) == num[i]
 
2. 2차원 배열 배열포인터로 접근

int num[2][2] = {{1,2},{3,4}};
int *p = num;
p[0][0], p[1][0] // 에러
 
- 2차원 배열을 1차원 포인터변수로 접근 시 오류발생.
- 문제 해결 위해 배열포인터 정의하여 사용함.
 
3. 배열 포인터
 
int (*p)[3];
 
- 자료형(가리키는 배열의 Base type) + 배열포인터 변수이름(* 연산자와 이름을 함께 괄호로 묶음+ 열 길이(가리키는 배열의 열 길이3부분으로 구성.
 
int num[2][3] = {10,20,30,40,50,60};
int (*p)[3] = num;
 
- 이 경우 p를 배열명처럼 사용 가능.
 
+] 포인터 배열
 
int* p[3];
 
- 단순히 포인터들의 배열.
- 괄호 쓰지 않음, 자료형 뒤에 * 연산자 붙여씀.
 
6. new & delete

동적 메모리 할당시 malloc & free 대신 newdelete 사용함.
 
int * ptr = new int;
double * ptr2 = new double;

int * arr1 = new int[3];
doble * arr2 =new double[7]; 

delete ptr;
delete ptr2;
delete []arr1;
delete []arr2;
 
- new 오른쪽에 자료형 명시, 반환은 포인터로, delete 뒤에는 변수명, 배열의 경우 [] 붙인다.
 
+] c언어의 라이브러리에서 h빼고 앞에 c 붙이면 c++의 헤더
 

댓글 없음:

댓글 쓰기