2014-09-14 4 views
1

나는 C 언어를 배우고 실제로 어쩌면 명백한 문제에서 멈췄다.포인터를 역 참조 해제

void allocateArray(int **arr, int size, int value) { 
    *arr = (int*)malloc(size * sizeof(int)); 
    if(*arr != NULL) { 
     for(int i=0; i<size; i++) { 
      *(*arr+i) = value; 
     } 
    } 
} 

발신자는 :

int *vector = NULL; 
allocateArray(&vector,5,45); 

이해에서 코드를 C 포인터를 사용하고 있습니다. 문제는이 라인이 어떻게 작동하는지 내가 상상도 할 수 있다는 것입니다 :

*(*arr+i) = value; 

더 정확하게 할 우리가 별을 역 참조 2를 사용하는 대신 단지 작성해야하는 이유 모르는, (*arr+i) = value;

그것은 것 어떻게 그리고 왜 그것이 그렇게되어야하는지에 대한 좋은 예를 얻는 것이 좋을 것입니다.

+0

무엇입니까'INT ** ar' : 코드의 두 번째 줄은 다음과 같이 다시 쓸 수 있도록 C 당신이, malloc 캐스팅 할 필요가 없습니다? 두 별표가 함께 무엇을 의미합니까? –

+1

int * p = malloc (size * sizeof (int));를 쓰면 훨씬 쉬워진다. * arr = p; 그리고 나서 * arr 대신에 p를 사용하십시오. – gnasher729

+0

@ PM77-1 int에 대한 포인터에 대한 포인터입니다. 당신은 바로 gnasher729입니다. 내가 이해할 때 지금은 쉽다. :) – python

답변

3

우리가 대신 arr 때문에 (*arr+i) = value;

를 작성하는 2 역 참조 별을 사용해야하는 이유를 모르겠다는 int에 대한 포인터에 대한 포인터, *arr+1int에 대한 포인터입니다. 함수 포인터 안에서 변수의 값을 변경할 수 있도록 이중 포인터가 필요합니다.

함수 내에서 sometype 변수를 변경해야하는 경우 일반적으로 함수에 sometype*을 전달하고 그 안에 추가로 별표를 사용하여 할당을해야합니다. 그렇지 않으면 함수 내의 매개 변수에 대한 변경 사항이 해당 함수에 대해 로컬로 유지됩니다. 이 경우 sometype 자체가 포인터 (즉, int*)이므로 allocateArray 내부에서 수정하려면 int**을 전달해야합니다.

참고 :

*arr = malloc(size * sizeof(int)); 
+3

사실 나는 질문을 게시 한 직후에 그것을 얻었지만 대답 해 주셔서 감사합니다. 나는 당신이 그것을 더 쉽게 풀 수 있기 때문에 자신에게 자신의 문제를 설명하는 것이 좋다라고 생각한다. :) – python