
- •6.1. Общая форма определения функции
- •6.2. Создание функции
- •6.3. Использование аргументов
- •6.4. Прототипы функций
- •6.5. Использование предложения return
- •6.6. Использование функций в выражениях
- •6.7. Основы техники указателей
- •6.7.1. Объявление указателей
- •6.7.2. Операторы указателей
- •6.8. Передача в функции указателей
- •6.9. Передача в функции массивов
- •6.9.1. Указатели и массивы
- •6.9.2. Способы передачи в функции массивов
- •6.10. Передача в функцию строк
- •6.10.1.Строковые константы
- •6.10.2. Передача строк
- •6.11. Возврат указателей
6.10. Передача в функцию строк
6.10.1.Строковые константы
С++ работает со строковыми константами, вроде той, что используется в приведенном ниже предложении:
cout << strlen("Ксантиф");
Когда компилятор сталкивается со строковой константой, он сохраняет ее в таблице строк данной программы и создает указатель на эту строку. В результате "Ксантиф" образует указатель на начало этой фразы в таблице строк программы. Ниже приведена программа, которая выводит фразу "Указатели увеличивают возможности С++":
#include <iostream>
using namespace std;
int main ()
{
char *ptr;
// Указателю ptr присваивается адpec этой строковой константы
ptr = " Указатели увеличивают возможности C++.\n";
cout << ptr;
return 0;
}
В этой программе символы, образующие строковую константу, хранятся в таблице строк, и указателю ptr присваивается адрес нашей строки в этой таблице.
6.10.2. Передача строк
Строка представляет собой обычный массив символов с нулем в конце, и когда вы передаете строку в функцию, фактически передается только указатель на начало строки. Этот указатель имеет тип char *. Рассмотрим в качестве примера следующую программу. В ней определена функция strInvertCase( ), которая преобразует строчные буквы строки в прописные и наоборот:
// Передача в функцию строки.
#include <iostream>
#include <cstring> I
#include <cctype>
using namespace std;
void strlnvertCase(char *str);
int main(){
char str[80];
strcpy(str, "This Is A test");
strlnvertCase(str);
cout << str; // вывод модифицированной строки
return 0;
}
// Преобразование регистра букв внутри строки,
void strlnvertCase(char *str)
{
while(*str) {
// преобразуем регистр
if(isupper(*str) ) *str = tolower(*str) ;
else if(islower(*str) ) *str = toupper(*str) ;
str++; // сместимся к следующему символу
}
}
Вот вывод этой программы:
tHIS iS a tEST
6.11. Возврат указателей
Функции могут возвращать указатели. Указатели возвращаются, как и данные любых других типов, и не вызывают никаких особых проблем.
В приводимой ниже программе демонстрируется использование указателя в качестве возвращаемого значения. Функция get_substr( ) просматривает строку в поисках заданной подстроки. Функция возвращает указатель на первую найденную подстроку. Если заданной подстроки найти не удалось, возвращается нулевой указатель. Например, если анализируется строка "Я люблю С++", а в качестве искомой задана подстрока "люблю", то функция вернет указатель на первую букву л в слове "люблю".
//Возврат указателя.
#include <iostream>
using namespace std;
char *get_substr(char *sub, char *str);
int main ()
{
char *substr;
substr = get_substr("three", "один два three four");
cout << "подстрока найдена: " << substr;
return 0;
}
/* Возвращает указатель на подстроку или нулевой указатель,
если подстрока не найдена.*/
char *get_substr(char *sub, char *str)
{
char *p, *p2, *start;
for(int t = 0; str[t] ; t ++)
{
p = &str[t]; // начальная установка указателей
start = p;
p2 = sub;
//проверка на наличие подстроки
while(*p2 && *p2==*p)
{
p ++;
p2 ++;
}// end while
/* Если р2 указывает на завершающий 0 (т. е. на
конец подстроки), значит, вся подстрока найдена. */
if(!*p2)
return start;// вернуть указатель на начало подстроки
}//end for
return 0; // подстрока не найдена
}
Вот вывод этой программы:
подстрока найдена: три четыре
Вопросы для самопроверки
Приведите общую форму определения функции.
Создайте функцию hypot(), которая вычисляет гипотенузу прямоугольного треугольника по двум его катетам. Продемонстрируйте использование этой функции в программе.
Может ли функция вернуть указатель? Может ли функция вернуть массив?
Создайте собственный вариант функции strlen() стандартной библиотеки.