2014-03-03 5 views
1
int newBoard[9][9]; 
int dirtyBoard[9][9]; 

/*add stuff to every element of dirtyBoard*/ 
... 

newBoard = &dirtyBoard; 

저는 newBoard를 cleanBoard의 정확한 사본으로 만들려고합니다. 성능이 중요하기 때문에 포인터 주소 나 다른 것을 변경하기 위해 각 요소를 한 번에 하나씩 복사하는 루프를 만들지 않아도되는지 알고 싶었습니다. 이것이 가능한가?C는 2 차원 배열을 다른 2 차원 배열로 가리 킵니다

답변

1

memcpy를 사용하십시오.

memcpy(newBoard , dirtyBoard , sizeof(newBoard)) ; 

는 두 배열은 같은 크기 여야 잊지 마세요, 또는 적어도 당신이에 복사 배열 커야합니다.

assert(sizeof(newBoard) == sizeof(dirtyBoard)) ; 

단순히 dirtyBoard를 가리키고 싶다면 포인터를 사용하십시오.

int (*p)[9] = dirtyBoard ; 

이제 p는 dirtyBoard와 거의 동일하게 작동합니다. newBoard 및 dirtyBoard 모두 정적으로 선언 된 배열이기 때문에

+0

그러나 이것은 각 요소를 추가하는 for 루프와 같은 것이 아닙니까? 어쩌면 조금 더 효율적이지만 본질적으로 같은 것일까요? newBoard가 호출 될 때 dirtyBoard가 실제로 참조되는 것을 변수로 리디렉션하기를 정말로 바랬습니다. – user1695505

+0

결과는 같습니다. 예. 복사본을 원했어. 동일한 배열을 가리키면 복사본이 생성되지 않습니다. – this

+0

@self. 호기심, "거의 정확히"는 그들이 여전히 다른 것을 의미합니까? 거기에 무엇이 남아 있습니까? 미리 감사드립니다. – Unheilig

1

사용 memcpy는 :

memcpy(newBoard, dirtyBoard, sizeof(newBoard); 

newBoarddirtyBoard에서 시작 sizeof(newBoard) 바이트를 복사합니다. newBoarddirtyBoard보다 크거나 같아야 버퍼 넘침이 이되지 않도록합니다..

1

사용 방어 적이기

memcpy(newBoard,dirtyBoard, sizeof(newBoard)); 
-1

, 당신은 단지 dirtyBoard의 주소로 newBoard를 가리킬 수 없습니다.

당신이 정적 배열로 모두하려는 경우, 각 요소에 데이터를 복사해야합니다 :

for(i=0;i<9;i++) 
    for(j=0;j<9;j++) 
     newBoard[i][j] = dirtyBoard[i][j]; 

편집 : 다른 언급했듯이, memcpy()이 갈 길, 그리고 더 효율적입니다 .

이 같은 int로 포인터의 배열로 newBoard을 정의 할 수

다음
int (*newBoard)[9]; 

당신은 다만 할 수 있습니다

newBoard = dirtyBoard; 

하지만, 차이는 여기입니다 newBoard 및 dirtyBoard 점을 같은 메모리에. 두 개의 별개의 정적 배열을 선언하면 두 개의 개별 데이터 사본이 생성됩니다.

희망이 있습니다. 당신은 아마 발견으로

+1

'int ** newBoard = & dirtyBoard' 할 수 없습니다. 'dirtyBoard'는 배열의 배열이지 포인터의 배열은 아닙니다. –

+0

@MattMcNabb 예, 한 줄에는 두 가지 심각한 오류가 있습니다. – this

+0

와우 ... 내 두뇌는 어딨어 .... 미안, 내 대답을 편집 했어, 지금 당장 생각한 것 같아. –

-1

, 당신은 할 수 없습니다

newBoard = &dirtyBoard; 

그러나 위의 구문은 다음과 같이 작동합니다 :

그러나
int newBoard[9][9]; 
int* dirtyBoard; 
int i, j; 
for(i = 0; i < 9; ++i) 
    for(j = 0; j < 9; ++i) 
     newBoard[i][j] = i*j; 

dirtyBoard = newBoard; 

, 당신은 복사되지 않습니다, 당신은 효과적으로하고 있습니다 별명. 포인터의 값을 업데이트하면 기본 배열을 업데이트하고 그 반대로도 업데이트합니다.

당신이 포인터를 통해 배열을 편집 할 경우에 당신은 이런 종류의 수행 할 수 있습니다

#define cols 9 
#define rows 9 

... 
int n; 

int newBoard[rows][cols]; 
int* dirtyBoard; 
int i, j; 

int row = 3; 
int col = 5; 

dirtyBoard[row * cols + col] = 3; /* to flip from 1 dimensional ptr -> [][] form */ 

당신의 정의 사용할 필요가 없습니다 ++ C로 사용할 수 있습니다 :

const int rows = 9; // and use as array dimensions. 
+0

-1, 컴파일되지 않습니다. – this

+0

@self 위의 비트가 컴파일되지 않습니다? –

0

배열은 가리 키지 않습니다. 하나의 int를 "re-point"할 수있는 것 이상의 int 배열을 "re-point"할 수 없습니다.

변수의 이름은 해당 변수에 할당 된 저장소에만 관련이 있습니다. 변수를 메모리로 옮기거나 변수의 이름을 다른 변수로 다시 사용할 수는 없습니다.

그러나 포인터가 가리 킵니다. 배열 (또는 배열의 하위 집합)을 가리키는 포인터를 만든 다음 다른 배열을 가리 키도록 포인터를 변경할 수 있습니다. 귀하의 경우

구문은 다음과 같습니다

int (*newBoard)[9] = &dirtyBoard[0]; 

이 9 int s의 1-D 어레이로 newBoard 점을 만든다. 그러면 구문 newBoard[i][j]을 사용하여 셀에 액세스 할 수 있습니다.

관련 문제