2011-09-06 1 views
1
주요

에서 수정 된 배열을 업데이트하기 위해 노력하고있어 :나는 2 차원 배열을이 함수에 전달할 다음 컴파일러 보여줍니다

Warning: passing argument 1 of 'fun' from incompatible 
pointer type; note: expected 'int()[5]' but argument 
is of type 'int (*)[5][5]' 

코드 :

#include<stdio.h> 

void fun(int * b[][5]) 
{ 

    int x=11,y=90; 
    printf("here"); 
    *b[1][3] = x; 
    *b[3][1] = y; 
    *b[2][2] = x + ++y; 
} 

int main() 
{ 

    int a[5][5]; 
    a[1][3] = 12; 
    a[3][1] = 145; 
    fun(&a); 

    printf("%d %d %d",a[1][3],a[3][1],a[2][2]); 
} 
+1

도움이 될 크기의 배열에, 그것을받을 포인터를 입력 보여줍니다 ... –

+2

또한 경우에 도움이 될 것이다 실제 질문이 포함되어 있습니다. –

답변

3

당신은 별표 (*)가 필요하지 않습니다 귀하의 함수 매개 변수에서, 당신은 당신의 함수에서 배열 b를 역 참조 할 필요가 없습니다. 배열은 참조에 의해 전달되므로 C는 시퀀스의 첫 번째 요소에 대한 포인터로 C를 처리하기 때문에 foo (&a)의 앰퍼샌드를 제거합니다.

다차원 배열은 더 작은 하위 배열, 즉 배열 배열의 시작 부분에 대한 포인터 배열로 처리됩니다. 위와 같은 설명이 적용됩니다.

코드는 결국 다음과 같아야합니다

배열이 함수에 전달됩니다
void fun(int b[][5]) // can also be (int (*b)[5]), i.e. array of 5 pointers 
{ 
    int x=11,y=90; 
    b[1][3] = x; 
    b[3][1] = y; 
    b[2][2] = x + ++y; 
} 

int main() 
{ // ... 
    fun(a); 
    // ... 
} 
+2

-1 당신이 불경스러운 "배열은 포인터"가 될 때까지 ...! –

+0

고정. 나는 그것이 틀렸을지라도 더 많은 의미가 있다고 생각했습니다 : P – evgeny

+0

-1을 삭제했습니다. 그러나 "배열은 참조로 전달됩니다"실제로 전체 그림을 말하지 않습니다. –

2
int a[5][5]; //is an 2d int array 

는 정말로 전달되는 것은 배열의 첫 번째 요소에 대한 포인터이다.

그래서 실제 크기 5 int 배열 포인터 수신처이 경우 a 제 소자 사이즈 제 기능 fun() 지능 배열 포인터 합격 fun(a)fun() 함수 호출, 즉이다

말하십시오 int (*b)[5]. int *b[5]은 동일하지 않으며 int 포인터를 포함하는 크기가 5 인 배열입니다.

귀하의 fun 기능 중 하나를 할 수있다 : 우리가 알고 있기 때문에

void fun(int b[][5]) 

또는

void fun(int (*b)[5]) 

이 기능은 INT의 2 차원 배열을받을 수 있다고 할 수있는 첫 번째 방법을,하지만 사실 함수에 보내집니다 배열 a의 첫 번째 요소에 대한 포인터입니다, 컴파일러는 조용히 매개 변수가 마치 포인터를받은 것처럼 함수를 컴파일합니다, 그것이받을 포인터이기 때문에.

명시 적으로 할 수있는 두 번째 방법을 사용하면 해당 언어로 질문을 태그 5.

+0

+1 : 지금까지 가장 정확한 답변입니다. 내 유일한 문제는 "첫 번째 방법은 함수가 2 차원 배열을받을 것이라고 말합니다"입니다. 그것은 말하지 않습니다, 단지 외형 적으로 보입니다. –

+0

고맙습니다 모두, 지금은 분명히, 정말 도움이 :) –