2016-10-13 2 views
0

난 그냥 C 프로그래밍 언어를 사용하여 포인터에 대해 배울 시작, 그리고 난 그들이 내가 사용 책에있는이 특정 코드 예제 위로 교차하고있다 :이 포인터 예제는 어떻게 오류를 생성하지 않습니까?

#include <stdio.h> 
#define SIZE 10 

void bubbleSort(int * const array, const size_t size); // prototype 

int main(void) 
{ 
// initialize array a 
    int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; 

    size_t i; // counter 

    puts("Data items in original order"); 

    // loop through array a 
    for (i = 0; i < SIZE; ++i) 
    { 
     printf("%4d", a[ i ]); 
    } // end for 

    bubbleSort(a, SIZE); // sort the array 

    puts("\nData items in ascending order"); 

    // loop through array a 
    for (i = 0; i < SIZE; ++i) 
    { 
     printf("%4d", a[ i ]); 
    } // end for 

    puts(""); 

return 0; 
} 

// sort an array of integers using bubble sort algorithm 
void bubbleSort(int * const array, const size_t size) 
{ 

    void swap(int *element1Ptr, int *element2Ptr); // prototype 
    unsigned int pass; // pass counter 
    size_t j; // comparison counter 

    // loop to control passes 
    for (pass = 0; pass < size - 1; ++pass) 
    { 

     // loop to control comparisons during each pass 
     for (j = 0; j < size - 1; ++j) 
     { 

      // swap adjacent elements if they’re out of order 
      if (array[ j ] > array[ j + 1 ]) 
      { 
       swap(&array[ j ], &array[ j + 1 ]); 
      } // end if 
     } // end inner for 
    } // end outer for 
} // end function bubbleSort 

// swap values at memory locations to which element1Ptr and 
// element2Ptr point 
void swap(int *element1Ptr, int *element2Ptr) 
{ 
    int hold = *element1Ptr; 
    *element1Ptr = *element2Ptr; 
    *element2Ptr = hold; 
} // end function swap 

은 내가 이해하고 있지 않다 것은 왜 이 오류를 포기하지 않기 때문에 bubbleSort 함수의 매개 변수에서 const이 배열 앞에 있고 배열을 변경하면 const을 가리킬 수 있으므로 변경할 수 없습니다. 그러나이 함수에서 배열의 요소를 바꿔서 배열을 변경하면 오류가 발생하지 않아야합니다. 나는이 상황에서 어떻게 포인터가 작동 하는지를 정확하게 이해하지 못하고 있다고 가정하고있다.

+0

'const array'는'array'가 가리키는 대상이 아니라'const'임을 의미합니다. 'array'는 포인터의 빈약 한 이름입니다. 나는 그것을 바꿀 것을 제안합니다! –

+0

@ M.M 죄송합니다. 책의 예에서 보여준 내용을 정확히 입력하기 만했습니다. – dj2k

답변

2

int * const array의 의미는 포인터 자체를 수정할 수 없지만 배열의 값을 수정할 수 있다는 것입니다. 다시 말해, 메모리에 블록이 있다고 가정하면 다른 메모리 블록에 주소가 저장됩니다. const이 유형 뒤에 오는 경우 주소를 보유하는이 블록의 값은 변경 될 수 없지만 실제 배열 값을 갖는 다른 메모리 블록은 변경 될 수 있습니다. 따라서 메모리의 새로운 부분을 인스턴스화하고 그 주소를 array에 넣을 수 없습니다.

+0

오, 와우, 바보가되었습니다. 설명을 읽은 후,'int * const array'와'const int * array'의 차이점을 깨달았습니다. 내 책에는'const char * sPtr'을 읽는 상수 데이터에 대한 상수가 아닌 포인터를 만드는 또 다른 예제가 있는데, 그 이유는 내 질문에있는 예제와 비슷하다고 생각했기 때문입니다. – dj2k

+0

@ dj2k 정직한 실수입니다. – afsafzal

관련 문제