2011. 5. 20. 10:03ㆍC++
C++ 기초2
1. const 키워드
변수를 상수화 시키는 키워드 입니다.
- const int n = 10; // n 이라는 value값 자체를 변경불가
- const int* n; // 데이터 상수화, n의 주소값이 가리키는 value값 변경 불가, *n=20 (x)
- int* const n; // 포인터 상수화, n의 주소값 변경 불가
- const int* const n; // n의 value와 주소값 모두 변경 불가
2. 메모리 구분
프로그램을 컴파일 하고 실행하면 메모리 공간이 잡히게 됩니다.
- 데이터 영역: 전역변수, Static 변수 (프로그램이 종료될때까지 메모리에 존재)
- 힙 영역: 런타임에 크기가 결정될수 있는것들을 올리기 위한 공간
프로그래머가 메모리 할당과 해제를 담당합니다.
int size; => 요건 Stack 영역에 할당
cin>>size;
function(size);
void function(int size){
int array[size]; // 이공간은 어떤 Size가 올지 모르기 때문에 Heap에 할당된다.
}
- 스택 영역: 컴파일 타임에 크기가 결정, 지역변수, 매개변수
4. malloc & free
malloc : 힙공간에 메모리 할당
free : 할당된 메모리 해제
char* name;
name=(char*)malloc(sizeof(char)*11); //11 바이트 필요함, 메모리 할당
strcpy(name, "안녕하세요");
printf("name : %s\n"), name);
free(name); // 할당한 메모리 해제
5. bool 기본 자료형
true & false 는 1과 0이 아니라 논리적인 참과 거짓을 의미하는 키워드 입니다.
int로 데이터 변환시 1과 0이 됩니다.
6. 레퍼런스
* 변수란 메모리 공간에 붙여진 이름
* 레퍼런스란 메모리 공간에 이름을 하나더 추가하는 행위
c++ 부터는 메모리 공간에 1개 이상의 이름을 붙여 줄수 있습니다.
int value = 10;
int *pVal = &val; // value의 주소값을 저장한다.
int &refVal = val; // 이제 refVal은 value 의 값을 가리킨다.
-----------------------
- & 키워드: 주소값 연산자 뿐만 아니라 레퍼런스 연산자로도 사용됩니다.
int &refVal : 선언할때는 레퍼런스 연산자로 사용
&refVal : 이렇게 사용할때는 refVal의 주소값을 말합니다.
int* val : val을 포인터 주소로 사용한다.
*val : val 이 가리키는 메모리 공간의 값을 말한다.
-----------------------
* 제약사항
- 레퍼런스는 생성과 동시에 초기화 되지 않으면 안된다. 상수 할당 할수 없다.
int &ref; (x)
int &ref = val; (0)
int &ref=10; (x)
-----------------------
swap(int* a, int *b) 와 swap(int& a, int& b)
=> 포인터를 이용한 CallBy 레퍼런스와 레퍼런스를 이용한 CallBy 레퍼런스
=> 잘못된 포인터 연산을 통한 위험성이 존재하기때문에 되도록 레퍼런스를 이용하도록 한다.
예> int* a;
a++; // 여기와 같이 a가 가리키는 곳의 값을 증가시키는게 아니라
주소값을 증가시키는 오류를 범할수 있기 때문이다.( 여기서는 int형 이므로 4byte 뒤로 이동된다.)
=> 레퍼런스로 전해줄경우 해당 값이 함수내에서 변경 못하게는 못하는가?
이때는 const 를 이용하면 됩니다.
swap(const int& a, const int& b)
7. new 와 delete
- 메모리 할당의 변화를 숙지합니다.
- new 연산자 : 메모리 할당 실패시 NULL 포인터를 리턴합니다.
따라서 if(arr==NULL) 일경우 메모리 할당이 실패한것입니다.
// 신규 방식 |
// 이전 방식 int* val = (int*)malloc(sizeof(int)); int* arr = (int*)malloc(sizeof(int)*size); free(val); free(arr); |
참고) 범하기 쉬운 오류
char* name = new char; // new char[20]; 이라고 해야겠죠?
// hello를 받을수 있는 만큼의 영역을 확보해야하니까요.
strcpy(name,"hello");
delete name;
위의 내용은 컴파일은 잘되지만 실행시 delete에서 먹통이 된다. char문자열 포인터를 잘못 지정했기 때문이다. 선언과 사용이 모두 틀린상태로 delete하게되어 free 시킬 영역을 찾지 못해 나오는 현상입니다.