#memset
memset은 메모리를 초기화 시키는 함수이다.
-> 이는 배열같은 함수를 초기화시 for문을 사용하지 않고 초기화 할 수 있다는 장점이 있지만,
* 1byte(8bits) 단위로 초기화 되기 때문에 0이 아닌 다른 수(예를들어 1)로 초기화 시에 이상한 값이 나올 수 있다.
함수 사용 시,
memset(메모리 시작주소, 초기화 할 값, 초기화할 크기)
로 사용 한다.
#include <iostream>
using namespace std;
void main()
{
int iArr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memset(iArr, 0, sizeof(iArr)); // iArr값을 모두 0으로 초기화
for (int i = 0; i < 10; ++i) // 출력
{
cout << iArr[i] << endl;
}
}
Tip.
= -> C기반의 초기화
ex) int iA=10;
() -> C++기반의 초기화
ex) int iA(10);
#include <iostream>
using namespace std;
void main()
{
int* ptr = new int(5);
cout << "*ptr: " << *ptr << endl;
delete ptr;
}
출력값은 5가 나온다.
#memmove 와 memcpy
memmove와 memcpy는 동일한 기능을 수행 하는 함수이다.
이름에서 알 수 있듯이, 한 메모리의 데이터를 다른 메모리에 복사해 넣는 함수이다.
사용법은 동일하다
memmove(복사받을 주소, 복사할 주소, 크기)
memcpy(복사받을 주소, 복사할 주소, 크기)
#include <iostream>
using namespace std;
void main()
{
int iA[5] = {};
int iB[5] = { 1, 2, 3, 4, 5 };
memmove(iA, iB, sizeof(iB)); // iB를 iA에 복사
for (int i = 0; i < 5; ++i)
cout << iA[i] << endl;
}
두 함수의 차이점은
1.
memmove는 표준,
memcpy는 표준이 아니다.
2.
memmove는 버퍼가 있어서 중간 버퍼에 복사 후 목적지에 재복사를 하는 반면,
memcpy는 버퍼를 이용하지 않고, 메모리에 직접복사 한다.
#레퍼런스
레퍼런스는 C++부터 나온 자료형이다.
이는 한 변수를 별명을 만들어 똑같이 사용한다고 생각하면된다.
주소값을 공유하여 같이 사용 하기 때문에, 포인터와 유사한면이 있다.
레퍼런스는
자료형& 변수명 으로 선언한다.
다만 레퍼런스는 한번참조한 메모리는 변경이 불가능 하기 때문에 선언과 동시에 초기화를 해주어야 한다.
#include <iostream>
using namespace std;
void main()
{
int iA = 10;
int& r = iA;
cout << "&iA: " << &iA << endl;
cout << "&r: " << &r << endl;
cout << "iA: " << iA << endl;
cout << "r: " << r << endl;
}
또한 const 변수를 참조하기 위해서는
레퍼런스 또한 const로 선언해주어야 참조 할 수 있다.
ex)
const int iA=10;
const int r=iA;
다만 int iA=10; const in r=iA; 일때에는 선언이 되며, iA를 통한 값변경이 가능하다. (r를 통한 값변경은 불가능)
레퍼런스는 포인터 대신 다음과 같이 사용이 가능하다.
#include <iostream>
using namespace std;
void Swap(int& _iA, int& _iB);
void main()
{
int iA = 1, iB = 2;
Swap(iA, iB);
cout << "iA: " << iA << endl;
cout << "iB: " << iB << endl;
}
void Swap(int& _iA, int& _iB)
{
int iTemp = _iA;
_iA = _iB;
_iB = iTemp;
}
이는 레퍼런스를 통해 직접 값에 접근하므로, 포인터에 비해 메모리값의 사용량을 줄일 수 있다.
예를들어 Add함수를 만들 때 레퍼런스 값을 통해 만들면,
Add(10,20) 과 같이 상수를 사용하면 에러가 발생하는데
이를 방지 하기 위해 함수를 만들때
int Add(const int& _iA, const int& _iB)
{
return _iA+_iB;
}
위와 같이 const를 붙여주면
Add(a,b) 와 같이 변수
Add(10,20) 와 같이 상수
모두 작동이 잘 된다.
#include <iostream>
using namespace std;
int Add(const int& _a, const int& _b);
void main()
{
int iA = 10, iB = 20;
cout << Add(iA, iB) << endl;
cout << Add(10, 20) << endl;
}
int Add(const int& _iA, const int& _iB)
{
return _iA + _iB;
}
'개발 Study' 카테고리의 다른 글
#24. string 자료형 및 디버깅 (0) | 2021.04.29 |
---|---|
#23. 전처리 명령어 (#define #if #ifdef 등) (0) | 2021.04.29 |
#21 입출력(2), 열거체(enum) 및 함수포인터 (0) | 2021.04.21 |
#20 스트림 개방 및 입출력 (0) | 2021.04.19 |
#19 동적할당 (2) 및 입출력 스트림 버퍼 (0) | 2021.04.17 |