Обозначения массива являются неизменяемыми значениями.То есть вы не можете изменить указатель массива таким образом, чтобы он определял другой массив.
Рассматривайте указатели массива как именованные экстенты памяти.
Что касается вашего примера, то это объявление функции
void test(char c[]);
корректируется компилятором следующим образом
void test(char *c);
, то есть параметр с типом массива корректируется компилятором на указатель.Так, например, эти объявления функций
void test(char c[100]);
void test(char c[10]);
void test(char c[1]);
void test(char c[]);
эквивалентны и объявляют эту единственную функцию
void test(char *c);
Вы можете включить все эти объявления в вашу программу, хотя они будут избыточными.
Например,
#include <stdio.h>
void test(char c[100]);
void test(char c[10]);
void test(char c[1]);
void test(char c[]);
void test( char *c)
{
c=c+2;
c--;
printf("%c",*c);
}
int main( void )
{
char ch[5]={'p','o','u','r'};
test(ch);
}
Для наглядности рассмотрим следующую программу
#include <stdio.h>
void test( char c[] )
{
printf( "sizeof( c ) = %zu\n", sizeof( c ) );
}
int main( void )
{
char ch[5]={'p','o','u','r'};
test( ch );
printf( "sizeof( ch ) = %zu\n", sizeof( ch ) );
}
Его вывод
sizeof( c ) = 8
sizeof( ch ) = 5
То есть в функции sizeof( c )
равен размеру указателя (в используемой системе он равен 8).В то время как в main sizeof( ch )
- это размер массива.
Когда вы передаете массив такой функции, тогда указатель массива неявно преобразуется в указатель на его первый элемент.Таким образом, эти вызовы
test( ch );
test( &ch[0] );
эквивалентны.
Это означает, что внутри функции вы имеете дело с указателем, и вы можете изменить значение указателя, используя арифметику указателя.