열혈강의 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

+ Recent posts