2013-09-14 3 views
0

Я читал это;
Хотя имя массива может использоваться как указатель (после разложения на указатель), невозможно присвоить ему новое значение. Попытка сделать это указать в другом месте ошибка:Можно ли присвоить новое значение имени массива?

while (*a != 0) // a is of (int *) type 
    a++;   //wrong 

С другой стороны, при передаче в функцию, имя массива всегда рассматриваются как указатель. Вызов

largest = largest_num(b, n) // b is an array of int 

функция для функции

int find_largest(int a[], int n) 
{ 

    .... 
    .... 

} 

вызывает указатель на первый элемент b быть назначен a.
Выше двух утверждений (выделено полужирным шрифтом) представляется мне противоречивым. Я запутался.

+0

'a' - указатель не массив @' find_largest (int a [], int n) ' –

+0

@GrijeshChauhan; Является ли 'a []' локальной переменной 'find_largest()'? – haccks

+1

Когда вы объявляете параметр функции как тип массива, компилятор в основном просто говорит: «Вверните вас, это указатель». И его идентичность как массив полностью потеряна. На мой взгляд, огромная бородавка на языке. –

ответ

3

В объявлении функции, массив рассматривается как если бы вы объявили указатель, так

int find_largest(int a[], int n) { 

обрабатывается как будто это было

int find_largest(int *a, int n) { 

Так что a - это указатель, а не массив, и нет никаких противоречий.

Поскольку это указатель, вы можете переназначить a, например.

a++; 

разрешено.

+0

Это означает, что в памяти не выделяется пространство после объявления 'int а [] '? – haccks

+0

И именно поэтому так лечится. – raina77ow

+0

Да, пространство выделяется для указателя, но не для массива. Он просто получает указатель на массив вызывающего. – Barmar

2

Никакого противоречия нет - вы все еще работаете с указателем (до int), а int a[] обозначение разрешено только для удобства. Цитирование the comp.lang.c FAQ:

Since arrays decay immediately into pointers, an array is never actually passed to a function. You can pretend that a function receives an array as a parameter, and illustrate it by declaring the corresponding parameter as an array:

void f(char a[]) 

Interpreted literally, this declaration would have no use, so the compiler turns around and pretends that you'd written a pointer declaration, since that's what the function will in fact receive:

void f(char *a) 

This conversion of array-like declarators into pointers holds only within function formal parameter declarations, nowhere else. If the conversion bothers you, you're under no compulsion to make use of it; many programmers have concluded that the confusion it causes outweighs the small advantage of having the declaration ``look like'' the call or the uses within the function.

Смежные вопросы