2017-02-13 5 views
0

Допустим, мы создаем массив, как:передачи указателей (название массива) в функции в C/C++

int a[4]={1,2,3,4}; 

Теперь a это имя этого массива, а также указатель указывает на первый элемент a[0] , Поэтому, когда я хочу вызвать элементы в массиве, я могу использовать a[ i ] или *(a+i).

Теперь у меня есть функция:

void print_array(int* array, int arraySize){ 
    for(int i=0; i<arraySize; i++){ 
     cout<<*(array+i)<<endl; 
     cout<<array[i]<<endl; 
    } 
} 

Когда я прохожу a[4]={1,2,3,4} в эту функцию с помощью print_array(a,4), для первой линии cout, я полностью понимаю, потому что я использую *(a+i) метод доступа к данным и a является указателем Я прошел.

То, что я не могу понять: так как я передать указатель a в функцию, поэтому я могу использовать a в формате a[i] как вторая линия cout? Разве не a указатель? Если a является указателем, почему работает a[i]?

Это смутило меня целый день. Любая помощь будет высоко ценится!

+3

a [b] всегда точно совпадает с символом '* (a + b)' независимо от того, что такое a и b. – fuz

+1

@fuz подробно объяснил здесь http://stackoverflow.com/questions/381542/with-c-arrays-why-is-it-the-case-that-a5-5a?rq=1 –

+0

Я думаю, что [i ], по существу, перевести значение в плюс один размер того, что указывает. –

ответ

0

a - это массив, а не указатель. Это не одно и то же. Однако имя a может быть неявно преобразовано в указатель (со значением &a[0]).

Например,

int main() 
    { 
     int a[] = {1,2,3,4}; 
     int *p = a;    // p now has the value &a[0] 

Теперь, после этого частичного фрагмента кода, предполагая, что i является целочисленным значением, правила суммы языка для;

  • a[i] эквивалентно *(a + i) что эквивалентно *(&a[0] + i)
  • p[i] эквивалентно *(p + i)

Теперь, так как p равно &a[0] это означает, что a[i], *(a + i), p[i] и *(p + i) являются все эквиваленты.

При вызове print_arrat(a, 4) где a - это имя массива, то a ВСЕГДА преобразуется в указатель. Это означает, что print_arrat() всегда передается указателем. И это означает, что *(array + i) внутри print_arrat() совпадает с a[i] в вызывающем.

0

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

Значение, если a является массивом, семантически, что случается:

int b = a[i]; => int *__tmp = a; int b = *(__tmp + i);

Однако после того, как оператор перегрузки входит в игру, то это уже не правда, что a[i] == *(a + i). Правая сторона не может быть определена.

+0

Это верно в C и на C++ перед [CWG 1213] (http: // open- std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1213), но теперь в C++ 'a [i]' и '* (a + i)' имеют тонкие отличия, когда 'a' имеет тип массива. – cpplearner

+0

Это очень прямой способ мышления (это помогает объяснить многое). Но интересно, так ли это определено в стандарте? (c и C++, если возможно?).Поскольку я всегда думал об этом как о функции массива, которая распространяется на указатели (поскольку объявление массивов использует те же скобки) –

+0

@cpplearner - Этот вопрос был помечен C первоначально, где то, что я сказал, имеет место. Без разницы. Я сделаю так, чтобы OP был новым пользователем. – StoryTeller

0

Эта цитата из стандарта C++ сделает точку ясно (5.2.1) индексации

1 А х выражение сообщения Fi, за которым следует выражение в квадратных скобках ФИ х выражение поста. Одно из выражений должно иметь тип «массив Т» или «указатель на Т», а другой должен иметь нумерацию или интегральный тип. Результат имеет тип «T». Тип «T» должен быть полностью определяемым типом объекта.64 Выражение E1 [E2] равно , идентичное (по определению) к * ((E1) + (E2)) [ Примечание: см. 5.3 и 5.7 для детали * и + и 8.3.4 для получения подробной информации о массивах. -end note], за исключением , что в случае операнда массива результат равен lvalue, если операнд - это lvalue и xvalue в противном случае.

0

Что я не могу понять: поскольку я передаю указатель «a» в функцию, почему я могу использовать «a» в формате [i], как вторая строка «cout»?

Поскольку индекс оператора a[i] определен для массивов, и это эквивалентно *(a+i) по определению.

В строке с cout вы используете array[i], но где array - указатель. Это также допускается, так как индексный оператор также определен для указателей.

Не является ли указатель поворота?

Номер a - это массив. array - указатель.