열혈강의 2장
oop 프로젝트1
배열을 함수로 넘겨줄 때.
int array[100]; --> 함수 선언
void arr(int *_arr){ ... }
배열의 이름은 배열의 첫주소를 나타낸다.
때문에 함수에 넘겨줄 때 & 주소값표시가 없어도 된다.
단, 배열 전체가 아닌 특정 값을 넘겨줄 때에는
arr(&array[2]); --> 주소값을 넘겨줘야한다.
arr(array) --> 배열의 첫 주소값이 넘어감.
arr(int *arr){
arr[i] = 3;
이런 형식으로 값을 바꿔줄 수 있다.
}
구조체 배열을 함수로 넘겨줄 때도 마찬가지.
typedef struct sss{
char name;
int num;
} SSS;
SSS aaa[100]; --> 구조체 배열 선언
void ss(SSS *_ss){
_ss->name = "ddd";
}
--> ss(&aaa[3]);
마찬가지로 배열의 한 부분을 넘겨줄 떄에는 주소값
그리고 변수 내에서는 -> 를 사용해서 접근한다.
ss(SSS *_ss){
_ss.name = "ddd";
}
ss(aaa);
배열을 통째로 넘겨줄 땐 &사용하지 않음
근데 왜 함수 안에서 ->를 사용하지 않는거지?
또 함수 내에서 배열에 *를 붙이지 않는 이유는?
-->??
========================================================================================
포인터 정리
typedef struct num{
int x;
int y;
}NUM;
int i[10] = {1,2,3,4,5,6,7,8,9,10};
NUM n[10]; --> 초기화가 되었다고 가정.
void Show(int * _val){}
void n_Show(NUM* _val){}
1 . Show(i);
2. Show(&i[2]);
3. n_Show(n);
4. n_Show(&n[2]);
1. 배열의 이름은 배열의 첫 인자 주소값을 가진다. 때문에 &키워드가 필요가 없다.
다만, 함수 내에서 배열을 참조할 때
_val 만 쓰면 --> 주소값
*_val 만 쓰면 --> 첫번째 값
배열의 모든 인자에 접근할 때
_val[x] or *_val+x
2. 배열 전체가 아니라 하나의 인자만을 전달 할 때에는 주소값을 넣어줘야 한다. (하나의 값이기 때문에)
함수 내에서 배열을 참조 할 때
_val --> 주소값
*_val --> 값
3. 구조체 또한 배열과 마찬가지
4. 주소값을 넘겨 받았기 때문에
함수에서 구조체의 멤버변수를 참조할 때
_val->x;
-val ----> 주소값
=================================================================================
1. const int n = 10;
2. const int* n;
3. int* const n;
4. const int* const n;
어떤 의미를 지니는가?
const : 변수를 상수화
2 --> 데이터 상수화 n이라는 포인터가 가르키는 값을 상수화
(포인터를 상수화하는게 아님)
포인터를 이용해서 값을바꾸는것을 방지
포인터가 가르키는 변수는 상수가 아님!
3 --> 포인터 상수화
가르키는 변수를 바꿀 수 없음
주소값이 상수화가 되서 하나의 변수만 가르킬 수 있다.
4 --> 데이터도 상수화 포인터도 상수화
포인터를 이용해서 값을 바꿀 수 없음
또한 하나의 변수만 가르킬 수 있다.
프로그램이 실행되면 운영체제가 메모리공간을 할당 해줌.
데이터 영역 --> 스태틱, 전역
프로그램의 실행과 동시에 생성 프로그램이 종료될 때 소멸
힙 --> 런타임 크기 결정
실행시에 동적으로 할당 됨.
프로그래머가 할당하고 해제함.
스택 --> 컴파일 타임 크기 결정
지역변수, 매개변수
스태틱에 대한 이해, malloc, free
int i;
cin >> i;
int a[i];
이거 실행 되나??
--> 실행 안됨!! --> int i = 7; int *a; a= new int[i]; --> 동적할당 해주어야 한다.
특정메모리 공간에 이름을 붙여주기 위한것 --> 레퍼런스
변수에 이름을 하나 더 붙여주기 위한 용도 --> 메모리 할당이 따로 일어나나?
call by reference 좀 더 확인
-->레퍼런스는 단순히 이름만 붙여주는 것!! 한 메모리 공간에 이름만 붙여주기 때문에 메모리할당이 따로 일어나지 않는다 -->>효율적!!
씨언어는 로우레벨 랭귀지와 하이레벨 랭귀지의 특성을 동시에 지닌다.
로우레벨의 대표적인 예 : 포인터
레퍼런스
레퍼런스와 변수는 완전히 같은 것이라 말할 수 있다.
변수로 할 수 없는 일은 레퍼런스로도 할 수 없고
레퍼런스로 하지 못하는 일 또한 변수로도 할 수 없기 때문이다.
레퍼런스를 이용한 콜바이레퍼런스는
값(메모리)의 복사가 없기 때문에 기능이 향상된다.
void showData(const person &p) {
} -->혹시모를 변경에 대한 위험 --> const 키워드
new and delete
malloc 와 free의 기능
malloc는 형변환과 함께 사이즈 계산을 해주어야 한다.
malloc는 주소값을 void로 리턴하기 때문에 형변환
주소값을 리턴한다는 점!
int * val = (int*)malloc(sizeof(int));
int * arr = (int*)malloc(sizeof(int)* size);
free(val);
free(arr);
---> new로 바꾼다면
int * val = new int;
int *arr = new int[size];
delete val;
delete []arr;
new 연산자를 사용했을 때 제대로 되었다면
변수에 주소값이 들어갈 것이고
아니라면 NULL을 리턴한다.
new는 객체의 동적생성도 가능하다.
if(arr==NULL){
cout<<"메모리 할당 실패"<<endl;
}
#if #endif 를 사용해서 좀 더 세련된 예외처리를 해보자.
'C++' 카테고리의 다른 글
[C++] virtual 소멸자, virtual table // 열혈강의 (0) | 2016.12.05 |
---|---|
[C++] 상속에 대하여 // 열혈강의 (0) | 2016.12.01 |
[C++] 기초4 // 열혈강의 (0) | 2016.12.01 |
[C++] 기초3 // 열혈강의 (0) | 2016.11.30 |
[C++] 기초1 // 열혈강의 (0) | 2016.11.28 |