Na 9ª edição do livro de Deitel C. Como programar (cap. 7), uma função é declarada como
void bubbleSort(int * const array, size_t size)
e no texto é especificado que " bubbleSort
o cabeçalho da função declara array
as int * const array
em vez de int array[]
to indicar que bubbleSort
recebe um argumento de array unidimensional. Novamente, essas notações são intercambiáveis; no entanto, a notação de array geralmente é preferida para legibilidade". Como "nomes de array são ponteiros constantes para o primeiro elemento do array" (citando o mesmo capítulo), e como um ponteiro constante para um dado não constante é definido (por exemplo) com int * const myPtr
, faz sentido que array
as int * const array
seja equivalente à notação de array mais compacta ao lidar com arrays.
Entretanto, no início do mesmo capítulo sobre ponteiros, os autores afirmam que "Quando o compilador encontra um parâmetro de função para uma matriz unidimensional da forma int b[]
, o compilador converte o parâmetro para a notação de ponteiro int *b
. As duas formas são intercambiáveis".
Então, de acordo com os autores, ambos int * const array
e int *array
são equivalentes a int array[]
. Por que adicionar a const
palavra-chave se eles são nomes de arrays e, portanto, por definição, ponteiros constantes para o primeiro elemento do array? Ou isso não é verdade quando arrays são passados para uma função?