일반 배열에 대한 범위 기반은 어떻게 작동합니까?
" 원거리가 (배열과 함께) 무엇을하는지 말해줘 "라고 읽어야 할까요? "
나는 다음과 같은 가정하에 대답 할 것이다-중첩 배열을 사용하는 다음 예제를 보자 :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
텍스트 버전 :
ia
[3]
각각 [4]
값을 포함하는 배열을 포함하는 배열 ( "중첩 배열")의 배열 입니다. 위의 예제 ia
는 기본 '범위'( [3]
)를 통해 반복되므로 [3]
시간을 반복합니다. 각 루프는 첫 번째에서 시작하여 마지막으로 끝나는 ia
의 [3]
기본 값 중 하나를 생성합니다 .- [4]
값을 포함하는 배열입니다 .
- 첫 번째 루프 :
pl
같음 {1,2,3,4}
-배열
- 두 번째 루프 :
pl
같음 {5,6,7,8}
-배열
- 세 번째 루프 :
pl
같음 {9,10,11,12}
-배열
프로세스를 설명하기 전에 다음은 어레이에 대한 몇 가지 유용한 알림입니다.
- 배열은 첫 번째 값에 대한 포인터로 해석됩니다. 반복없이 배열을 사용하면 첫 번째 값의 주소가 반환됩니다.
pl
배열을 복사 할 수 없으므로 참조 여야 합니다.
- 만약이 - 어레이 객체 자체에 번호를 추가 할 때 배열로, 그것은 앞으로 해당 항목에 많은 시간과 '점'고 진보
n
, 다음 문제의 숫자가 ia[n]
동일하다 *(ia+n)
(우리의 주소를 역 참조하는 n
항목을 앞으로), (배열에서 해당 항목의 주소를 얻음 )과 ia+n
동일 &ia[n]
합니다.
무슨 일이 일어나고 있는지 :
- 각 루프에서
pl
A와 설정된 기준 으로 ia[n]
하여, n
0 지금부터 전류 루프 횟수를 같게 pl
이고 ia[0]
그것의 두번째, 제 1 라운드 ia[1]
등. 반복을 통해 값을 검색합니다.
ia+n
이보다 작은 한 루프가 계속됩니다 end(ia)
.
... 그게 다입니다.
이것은 실제로 이것을 작성 하는 간단한 방법입니다 .
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
배열 이 중첩 되지 않은 경우 반복 된 값이 배열이 아니라 '정상'값이기 때문에 참조가 필요 하지 않다는 점에서이 프로세스가 조금 더 간단 해 집니다.
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
추가 정보
auto
만들 때 키워드 를 사용하지 않으려면 pl
어떻게합니까? 어떤 모습일까요?
다음 예에서, pl
을 말한다 array of four integers
. 각 루프 pl
에는 다음 값이 제공됩니다 ia[n]
.
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
그리고 ... 그것이 작동 방식이며, 혼란을 없애기위한 추가 정보가 있습니다. for
자동으로 계산 되는 '속기' 루프 일 뿐이지 만 수동으로 수행하지 않고 현재 루프를 검색하는 방법이 부족합니다.
for
. 그러나 배열이 포인터로 붕괴되는 순간 크기 정보가 손실됩니다.