Я предлагаю сходить в книжный магазин, чтобы купить книгу Кернигана и Ритчи Язык программирования C и, при желании, книгу C: Справочное руководство от Harbison & Steele.
Первый случай дает вам массив из 100 целых чисел, выделенных в стеке. В последнем случае вы получаете указатель на целое число, адрес которого совпадает с адресом буфера, выделенного в куче, размер которого достаточно велик, чтобы вместить 100 целых чисел.
Язык C по своей сути является аппаратно-независимым языком ассемблера. Различие между указателем и массивом намеренно размыто, поскольку нотация ссылки на массив является синтаксическим сахаром для арифметики указателя. Этот:
int foo( int a )
{
int x[100] = load_X() ;
int y = x[ a ] ;
return y ;
}
идентичен
int foo( int a )
{
int *x = load_X() ;
int y = *( x + a ) ;
// note that the use of sizeof() isn't required. For the pointer carries around
// an implicit increment size (the size of the object to which it points). The above
// is equivalent to
//
// int y = *(int*)((char*)x + (a*sizeof(*x)) ) ;
}
Далее компилятор будет (или должен) ныть о несоответствии типов, учитывая функцию foo()
:
public void foo( int a[] )
{
...
}
Вызов:
int *p = malloc(...) ;
foo(p) ;
должно привести к жалобам компилятора на несоответствие типов.
person
Nicholas Carey
schedule
14.07.2011