CF) C언어 복습 – const, 메모리 공간
1. const 키워드
const int num = 10;
- num 값 변경 불가!
const int* p = #
- “상수형 정수의 주소를 저장하겠다” 의 의미
- *p = 20 (에러), p = &num2 (ok)
int* const p = #
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, false는 0,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;
int temp = *p1;
*p1 = *p2 ;
*p2 = temp;
}
void swap1(int &p1,int &p2){
int temp = p1;
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);
- num와 num1은 동일한 메모리 공간을 나타내는 변수.
- 함수 호출2 : int num2 = Plusoneref(num);
- num와 num2는 다른 메모리 공간을 나타내는 변수.
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 대신 new와 delete 사용함.
int * ptr = new int;
double * ptr2 = new double;
int * arr1 = new int[3];
doble * arr2 =new double[7];
delete ptr;
delete ptr;
delete ptr2;
delete []arr1;
delete []arr2;
- new 오른쪽에 자료형 명시, 반환은 포인터로, delete 뒤에는 변수명, 배열의 경우 [] 붙인다.
+] c언어의 라이브러리에서 h빼고 앞에 c 붙이면 c++의 헤더
댓글 없음:
댓글 쓰기