2012-04-19 7 views
4
void f(int *a, int n) 
{ 
    int i; 
    for (i = 0; i < n; i++) 
    { 
     printf("%d\n", *(a+i)); 
    } 
} 

위의 코드는 확인 일 : C의 함수에서 포인터를 배열로 전달 하시겠습니까? <code>main()</code>에 내가 전화하면

int a[] = {1,2,3}; 
int *p = a; 

f(a, 3); 

그러나 main()의 경우

, 내가 그랬어 :
int *a =(int*) {1,2,3}; 

f(a, 3); 

그런 다음, 프로그램이 충돌합니다. 나는 이것이 이상하게 보일지 모르지만 나는 공부하고 있고 그 차이점을 알고 싶다.

답변

9

이것은 캐스트 때문입니다. 이 행의 내용 :

int *a =(int*) {1,2,3}; 

int에 대한 포인터로 배열 {1,2,3}을 처리하십시오. 32 비트 시스템에서 포인터의 값은 이제 1이며 원하는 값이 아닙니다.

그러나, 당신이 할 때

int *p = a; 

컴파일러는 첫 번째 요소의에이 포인터로 배열 이름을 붕괴 할 수 있음을 알고있다. 그것은 당신이 실제로 쓴 것 같다 :

int *p = &(a[0]); 

을 마찬가지로, 컴파일러는 배열 이름을 부패하므로 그냥 포인터로, 똑바로 함수에 a을 전달할 수있는 함수 인수로 사용했을 때

int a[] = {1,2,3}; 
int *p = &(a[0]); 

f(p, 3) 
f(a, 3); // these two are equivalent 
+3

또한 다음과 같이 'a'를 지정할 수 있습니다 :'int * a = (int *) (int []) {1, 2, 3}; ' –

+2

. 그러나 좋은 양심으로 그것을 권할 수는 없다.) –

관련 문제