Void centimize(double*);//прототип
double varray[MAX]={10.0,15.1,12.3,13.7,10.2};
centimize(varray);
for(int j=0;j<MAX;j++)
cout<<”varray[“<<j<<”]=”<<varray[j]<<”см”<<endl;
bioskey(0);
return 0;
}
////////
void centimize(double* ptrd)
{for(int j=0;j<MAX;j++)
*ptrd++*=2.54;
}
Програма 20.10
Прототип функції такий сам, як і в попередній програмі; функція має один аргумент – вказівник на double. При передачі масиву за значенням це виглядало б так:
void centimize(double[]);
Записи double* і double[] еквівалентні, але синтаксис вказівника використовується частіше. Оскільки ім’я масиву є його адресою, то ми не маємо потреби використовувати операцію взяття адреси & при виклику функції
centimize(varray);
У функції centimize ми використовуємо досить складний вираз
*ptrd++*
Як дізнатися, що в цьому виразі збільшується вказівник, а не його вміст? Іншими словами: як компілятор проінтерпретує цей вираз - як *(ptrd++), як нам і потрібно, чи як (*ptrd)++ ? Знаки *(операція розіменування) та ++ мають одинаковий пріоритет. Однак операції однакового пріоритету відрізняються ще й іншим способом – асоціативністю. Асоціативність визначає, як компілятор починає виконувати операції – справа чи зліва. В групі операцій, що мають праву асоціативність, компілятор спершу виконає операцію, яка стоїть справа. Унарні операції * та ++ мають праву асоціативність, тому наш вираз інтерпретується як *(ptrd++) і збільшує вказівник, а не те, на що він вказує. Таким чином, спершу збільшується вказівник, а потім до результату застосовується операція розіменування.
Дата добавления: 2015-08-26; просмотров: 569;