2012-08-29 2 views
0

런타임에 생성 된 두 개의 정수 배열이 있습니다 (크기는 프로그램 입력에 따라 다름). 어떤 시점에서 배열의 내용을 다른 계산의 일부로 업데이트해야합니다.포인터를 함수 매개 변수로 전달할 수 있습니까?

처음에는 C에서 함수를 반환하는 방법을 찾지 못했기 때문에 이러한 배열을 매개 변수로 전달하는 방법에 대해 생각했습니다. 스택 포인터를 복사 할 때 매개 변수가 실제로 수정 가능하지 않기 때문에 나쁜 생각 이었지만 배열 포인터로 바꾸는 것이 좋습니다.

1 테이크 (코드는 오류를 컴파일 없음) :

// Elements is just to be able to iterate through their contents (same for both): 
void do_stuff(int first[], int second[], int elements) {} 

// Call to the function: 
do_stuff(first, second, elements); 

2 걸릴 수 있기를 포인터로 변환하는 시도

기능이 여전히 비어 있지만, 이것은 내가 가지고있는 코드입니다 장소에 배열을 수정 : 나는 배열에 대한 포인터로 생각 분명히 무엇 때문에

void do_stuff(int *first[], int *second[], int elements) {} 

// Call to the function: 
do_stuff(&first, &second, elements); 

일부 정당한 컴파일 시간 오류로이 코드 리드, 포인터의 배열이었다.

3 테이크, 나는 그것이 올바른 구문 될 거라고 생각 :

error: invalid use of array with unspecified bounds 
:

void do_stuff(int (*first)[], int (*second)[], int elements) {} 

// Call to the function: 
do_stuff(&first, &second, elements); 

아직도이 코드는 배열의 요소 (예 : *first[0])에 액세스하려고 할 때 시간 오류를 컴파일 생산

내 질문에 함수의 매개 변수로 배열 포인터를 사용하는 가능성에 관한, 가능합니까? 그렇다면 어떻게 할 수 있습니까?

어쨌든, 두 번째 내용을 포함하는 계산을 수행 한 후 첫 번째 배열을 업데이트하는 더 좋은 방법을 생각하면 그에 대한 의견을 말하십시오.

+0

함수 인수로 배열을 전달할 때 실제로 첫 번째 요소에 대한 포인터를 전달하므로 해당 포인터를 사용하여 함수에서 배열을 수정할 수 있습니다. –

답변

2

배열은 배열에 할당 된 데이터에 대한 포인터로 감소합니다. 배열은 함수에 전달할 때 스택에 복사되지 않습니다. 따라서 배열에 포인터를 전달할 필요가 없습니다. 그래서, 아래에 잘 작동해야합니다. int *first[] (과 같은 다른 사람들이)을 int로 포인터의 종류 배열 실제로 때문에

// Elements is just to be able to iterate through their contents (same for both): 
void do_stuff(int first[], int second[], int elements) {} 

// Call to the function: 
do_stuff(first, second, elements); 

두 번째 시도에서 오류의 원인

입니다. *first[N] 실제로 쉽게 할 수없는 *(first[N])이기 때문에

당신의 세 번째 오류의 원인이다. 배열 액세스는 실제로 포인터 연산에 대한 외관입니다 (*(first + sizeof first[0] * N)). 그러나 여기에 불완전한 요소 유형이 있습니다. 배열의 크기를 지정해야합니다. 그렇지 않으면 sizeof first[0]을 알 수 없습니다.

1

첫 번째 시도가 정확합니다. C에서 매개 변수로 배열을 전달할 때 배열의 복사본이 아닌 첫 번째 요소에 대한 포인터가 실제로 전달됩니다.그래서 당신은 자동으로 데이터에 대한 포인터로 붕괴 C 배열에서 당신이 있었다처럼 하나

void do_stuff(int first[], int second[], int elements) {} 

, 또는

void do_stuff(int *first, int *second, int elements) {} 
0

쓰기, 그래서, 당신은 단지 배열과 길이를 전달할 수 있으며, 원하는 결과를 얻을 수 있습니다 .

void dostuff(int *first, int firstlen, int *second, int secondlen, int elements) 

함수 호출이 있어야한다 :

do_stuff(first, firstlen, second, secondlen, elements); 

내가 아주 명확하지 않다 당신이 elements 필요한 이유를 질문에서

나의 제안은 다음과 같이한다. 그러나 함수에 전달할 때 배열에 자동으로 포인터가 감쇠되므로 배열 길이를 전달해야하지만 호출 된 함수에서는 크기를 확인할 방법이 없습니다.

+0

'elements'는 배열의 길이를 지정했기 때문에'length'는 훨씬 더 명확합니다; 감사. –

관련 문제