2011-09-17 5 views
1

4 개의 int 배열을 가지고 있습니다. 그들은 모두 같은 수의 요소를 가지고 있습니다. 이런 식으로 뭔가 : 나는 루프를 실행할 때c 배열에 다른 배열을 보유 할 수있는 방법이 있습니까?

int ar1[] = {1,2,3,4}; 
int ar2[] = {10,12,13,14}; 
int ar3[] = {8,9,15,16}; 
int ar4[] = {17,18,19,20}; 
int big[][] ={ar1,ar2,ar3,ar4}; // I know this is messed up but here is where the question lies 

있도록 방법이 있나요 :

그래서
int i; 
for(i =0; i<4; i++){ 
    int x; 
    for(x = 0; x<4; x++){ 
     printf(big[i][x]); // something like this 
    } 
} 

이이 실행될 때, 그것은 밖으로 인쇄한다 :

배열을 1 : 1 2 3 4 어레이 2 : 10 12 13 14 등 .....

감사합니다.

귀하의 코드는이 작업을해야한다 C에서 다차원 배열에 대한 일반 정보에 대한 Multidimensional arrays in Cthis Wikipedia page :

답변

3

확인이를 당신이 그것을 필요로 아주 가까이있어

int* big[] = {ar1, ar2, ar3, ar4}; 
+0

감사합니다. – Spencer

0

물론, 및 . C에서, 당신이하는 일은 (항상) 많은 수의 주소를 생성하는 것입니다. 그리고 여러분이나 컴파일러는 여러분이 원하는 많은 차원을 다루기 위해 필요한 산술 연산을 수행합니다.

자, 우리는 1 차원 배열을 가정 해 봅시다, 벡터 :

메모리에서
int vec[] = {0, 1, 2, 3 }; 

, 즉 이름과 위치가된다 vec

vec: 
    DS 0 
    DS 1 
    DS 2 
    DS 3 

DS 그냥 말된다 " 저장 장치를 정의하고 "로 초기화하십시오.

당신은 그것을 반복하는 for 루프를 작성하는 경우 :

int ix; 
for(ix=0; ix < 4; ix++){ 
    printf("%d\n", vec[ix]); 
} 

이 다소

ix: DS 0 
loop: CMP ix, 4 
     JGE end  ; jump if comparison is >= 
     PUSH vec+ix ; address arithmetic 
     JSR PRINTF ; call the printf routing using value on the stack 
     INC ix  ; ix := ix+1 
     JUMP loop ; goto top 
end: 

같은 루프 (. 즉, 특별한 어셈블러 단지 의사의)

된다

이제 2 차원 배열을 만들자.

메모리 451,515,

, 그것은 단지 환언

ary2: 
    DS 0 
    DS 1 
    DS 2 
    DS 3 
    DS 4 
    DS 5 
    DS 6 
    DS 7 

메모리 또 블로된다. 그 당신이 있는지 확인하기 위해 필요한 정확한 값입니다 - 우리의 루프는 당신이를 걸 으면, 당신이 찾으 ary2[ix][jx]ary2+6 ..., ary2+0, ary2+1, ary2+2ary2+7 전환이다

ix: DS 0 
jx: DS 0 
;; Now, the compiler helps us a little bit: it "remembers" that 
;; the inner array is 4 long. We'll keep that around as 'len' 
len: DS 4 
ofst: DS 0 ; and we'll keep a convenient variable for the "offset" 
;; here's out loop 
loop1: 
     CMP ix, 4 
     JGE end1 
loop2: 
     CMP jx, 4 
     JGE end2 
;; I'm going to cheat here. ASSUME I've got a little 
;; routine that multiplies ix*len and puts it in offset 
     MLTOFFSET ix,len 
     ADD jx, ofst 
;; so what this all did was make ofst == (ix*len)+jx 
     PUSH ary2+ofst 
     INC jx 
     JUMP loop2 
end2: 
     INC ix 
     JUMP loop1 
end1: 

된다 한 조각의 메모리 은 2 차원 배열과 같습니다.

같은 트릭은 물론 원하는만큼 많은 차원에서 수행 될 수 있습니다. 컴파일러는 단계가 얼마나 큰지를 "기억"해야합니다.

1

C 2 차원 배열은 배열 배열보다 많거나 적습니다. 이러한 2 차원 배열은 "거친"배열 일 수 없으며, 즉 각 행은 동일한 수의 요소를 가져야합니다. 당신은 첫 번째 차원을 생략 할 수 있습니다

int big[4][4] = 
    { { 1, 2, 3, 4 }, 
     { 10, 12, 13, 14 }, 
     { 8, 9, 15, 16 }, 
     { 17, 18, 19, 20 } }; 

: int big[][4] = ...을하고, 길이는 초기화에 의해 결정됩니다,하지만 당신은 두 번째를 생략 할 수 없기 때문에 당신의 특별한 경우를 들어, 당신은 그것을 선언 할 수 있습니다. 이 방법의

하나의 장점은 단일 개체라는 것이다, 그리고 당신은 얼마나 많은 요소를 결정하기 위해 sizeof를 사용할 수 있습니다

sizeof big == 16 * sizeof (int) 
sizeof big[0] == sizeof *big == 4 * sizeof (int) 
sizeof big[0][0] == sizeof (int) 

그러나 단점은 크기가 고정되어 있다는 점이다.

다른 방법은 포인터 배열을 사용하는 곳 어레이의 첫 번째 요소의 각 포인터 점수

int row0[] = { 1, 2, 3, 4 }; 
int row1[] = { 10, 12, 13, 14 }; 
int row2[] = { 8, 9, 15, 16 }; 
int row3[] = { 17, 18, 19, 20 }; 

int *big[4] = { row0, row1, row2, row3 }; 

는 (이니셜에서 row0 배열 이름이지만 포인터로 붕괴 첫 번째 요소로, 마찬가지로 row1, row2row3에 대해). 이것은보다 유연하지만 각 행의 요소 수를 추적해야합니다. sizeof big[0]은 행 자체가 아닌 포인터의 크기를 제공합니다. .

또 다른 방법은 big 포인터 - 투 - 포인터를 만들 수 있습니다 :

int row0[] = { 1, 2, 3, 4 }; 
int row1[] = { 10, 12, 13, 14 }; 
int row2[] = { 8, 9, 15, 16 }; 
int row3[] = { 17, 18, 19, 20 }; 

int *rows[] = { row0, row1, row2, row3 }; 

int **big = rows; 

이 (그리고 실제로 당신은 아마 malloc()으로 모든 할당 것

네 번째 접근 방식을 훨씬 더 유연를, 아마도 매우 유용하지는 않지만 배열에 대한 포인터의 배열을 big으로 만들면됩니다.

배열 - 포인터 감쇠 규칙으로 인해 big은 4 가지 유형으로 4 가지 유형이 있으며, int 요소를 참조하는 동일한 구문을 사용할 수 있습니다 (big[x][y]).

권장되는 읽기 : 항상 그렇듯이 : comp.lang.c FAQ의 섹션 6.

0

각 배열 (4 개)의 요소를 알고 있으므로 16 개의 요소가있는 더 큰 배열을 쉽게 만들 수 있습니다 .... arr1, arr2, arr3, arr4 및 arr5 (전체 4 개 개의 어레이가 그 안에 저장되는) 는 더 큰 어레이를 통과하고, 더 작은 어레이에 대한 내용에

arr5 채울 수 -> [4 개 요소] arr1 ---------- [4 요소] arr2 -------- [4 요소] arr3 ------- [4 요소] arr4 ========== [16 개 요소]의

(ⅰ = 0; 나는 < 16; I ++) // 이송 큰 어레이) {

// 제 배열, 콘텐츠를 작성하고 i를 증가 이는 것 큰 배열 채우기 (j = 0; j < 4; j ++, i ++) arr5 [i] = arr1 [j]; 도 마찬가지입니다.

관련 문제