for-each 반복
int main()
{
int fibonacci[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
//change array values
for (int number : fibonacci)
number = 10;
//output
for (int number : fibonacci)
cout << number << " ";
cout << endl;
return 0;
}
이렇게 array의 value를 바꾸고 싶을 때는 이런 식으로 하면 바뀌지 않습니다. 여기서의 number는 fibonacci 배열의 요소를 복사한 값입니다. 이것은 원래 배열의 복사본이기 때문에 number를 변경해도 실제 배열의 요소의 값은 변하지 않습니다.
따라서 number를 수정하는 것은 원래 배열에 아무런 영향을 끼치지 않습니다.
for (int& number : fibonacci)
number = 10;
따라서 이런식으로 참조를 선언해준다면 배열의 각 요소를 직접 수정할 수 있습니다.
#include<iostream>
#include <limits>
#include <algorithm>
using namespace std;
int main()
{
int fibonacci[] = { 0, 1, 1, 2, 300, 5, 8, 13, 21, 34, 55, 89 };
int max_number = std::numeric_limits<int>::lowest();
for (const auto& n : fibonacci)
max_number = std::max(max_number, n);
cout << max_number << endl;
return 0;
}
modern c++를 사용하면서 최대값을 찾는 부분의 코드가 정말 깔끔해지고 있습니다. 이런 식으로 배열을 최대값을 찾기 위해서는 numeric 을 걸어주고 for문을 사용해서 구해주시면 됩니다.
int max_number = std::numeric_limits<int>::lowest() 이렇게 해서 int 형의 가장 작은 값으로 초기화를 합니다. 그 다음 for(const auto& n : fibonacci)를 통해서 fibonacci 안에 있는 수의 max 를 비교한 다음 max를 출력해주는 for문을 만들어줍니다.
위의 코딩은 범위 기반 루프를 사용해서 배열에서 가장 큰 값을 찾고 출력하는 프로그램입니다.
void 포인터 (generic 포인터)
int main()
{
int i = 5;
float f = 3.0;
char c = 'a';
void* ptr = nullptr;
ptr = &i;
ptr = &f;
ptr = &c;
return 0;
}
이렇게 void 포인터에 int, float, char 각각 다른 변수를 넣어도 전부 다 정상적으로 오류없이 ptr을 받습니다. 주소 그 자체이기 때문에 void 포인터에 주솔들 넣는 것은 어떠한 문제도 되지 않기 때문입니다.
하지만 void로 넣을 경우 이후 ptr에서 float인지, char인지 구별을 못하기 때문에 이런 점에서 불편한 점이 있습니다. 그래서 ptr + 1 이런 식으로 할 때 몇 바이트를 더해야 할 지 컴퓨터가 알 수 없기 때문에 동작을 하지 않습니다. 그래서 포인터 연산을 할 수 없습니다.
가져오려면 *static_cast<float*>(ptr) 이런 식으로 해주시면 됩니다. 이렇게까지 해서 void 포인터를 써야할까? 라는 의문점이 들 수 있습니다. 다형성 구현을 하다보면 이렇게 가야하는 때가 있기 떄문에 해야하긴 합니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 6.20~21] array 소개, vector 소개 (0) | 2024.03.30 |
---|---|
[따배시 6 .19] 다중 포인터와 동적 다차원 배열 (0) | 2024.03.30 |
[따배시 6.15 ~ 6.16] 참조, 포인터와 참조의 멤버 선택 연산자 (0) | 2024.03.30 |
[따배시 6.14] 참조 변수 (0) | 2024.03.30 |
[따배시 6.13] 포인터와 const (0) | 2024.03.29 |