Строки и указатели
Указатели могут адресовать переменные, массивы всех типов, таких как int, float, double и другие, включая тип char. Строка доступна через указатель на первый символ в строке. Строковые указатели объявляются как char*:
char * pstr = "ABCDE";
Объявляется переменная-указатель pstr, которая будет содержать адрес начала строки "ABCDE". Этот оператор можно записать и так:
char * pstr; pstr = "ABCDE";
Следует различать следующие операторы:
сhar * pstr = "ABCDE"; и char mas[] = "ABCDE";
В первом случае значение указателя может быть изменено, так как указатель – это переменная. Во втором случае значение имени массива не может быть изменено, так как имя массива – это константа.
Строковые указатели являются адресами, которые определяют местонахождение первого символа строки, сохранённой в памяти компьютера.
Если в программе объявлен указатель
сhar * pstr;
то перед первым использованием надо обязательно его проинициализировать. Это можно сделать по общим правилам одним из следующих способов:
можно использовать ранее определённую статическую cтроку:
char s[] = "ABCD"; pstr = s;
можно использовать определённый ранее адрес другой строки:
char * s = "ABCD"; pstr = s;
можно зарезервировать память для строки и определить значение pstr с помощью операции new:
int n = 10; pstr = new char[n];
// Пример 10.4. Указатели на тип char.
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char *s1,*s2,*st = "0123456789";
cout<<"st = "<<st<<endl; // st = 0123456789
s1 = st + 5;
cout<<"s1 = "<<s1<<endl; // s1 = 56789
cout<<"*s1 = "<<*s1<<endl; // *s1= 5
cout<<"&st[5] = "<<&st[5]<<endl; // &st[5] 56789
cout<<"st[5] = "<<st[5]<<endl; // st[5]== 5
//---------------------------------------------------------------------------------------
s1--;
cout<<"s1 = "<<s1<<'\n'; // s1== 456789
cout<<"*(s1+2) = "<<*(s1+2)<<'\n'; // *(s1+2)== 6
//---------------------------------------------------------------------------------------
cout<<"&st== "<<&st<<endl; // адрес самого указателя
cout<<"(int)st== "<<(int)st<<endl; // адрес строки
cout<<"&st[1]== "<<(int)(st+1)<<endl; // адрес 1-го символа
cout<<"&st[9]== "<<(int)(st+9)<<endl; // адрес 9-го символа
//---------------------------------------------------------------------------------------
char s3[20];
cout<<"Vvedi s3: "<<endl; gets(s3); // 123456789
cout<<"s3 = "<<s3<<endl;
s3[5] = '\0'; cout<<"s3 = "<<s3<<endl; // s3 = 12345
system("pause");
}
// Пример 10.5. . Создание и удаление динамической строки.
#include <iostream>
#include <cstring>
using namespace std;
int main(){
int n;
cout<<"Vvedi n: "; cin>>n;
char * s = new char[n];
if (!s){ cout <<"No memory"; exit(1); }
fflush(stdin); cout<<"vvedi stroku s: "; gets(t);
puts(s); // вывод строки
delete [] s;
}
Строки и функции
При передаче строки в функцию, передаётся адрес её начала, который, по сути, является адресом начала массива. Причём это справедливо не только для строк, содержащихся в массивах, но и для строковых констант. Если такая константа передаётся в качестве аргумента функции, в функцию передается адрес её начала. Параметром функции в этом случае должна быть переменная-указатель на тип char.
// Пример 10.6 Используются функции вывода строки,
// преобразования символов строки к верхнему регистру.
#include <iostream>
using namespace std;
void strShow(char * str){ // функция вывода строки
cout<<"str = ";
while(*str) cout<<*str++;
cout<<endl;
}
void strUpper(char * str){ // перевод в верхний регистр
int i = 0;
while(str[i]){
if(str[i] >= 'a' && str[i] <= 'z') str[i] = str[i] - 32;
i++;
}
}
int main(){
int n;
cout<<"Vvedi max chislo simvolov v stroke:"; cin>>n;
char * pstr = new char [n+1]; // выделение памяти под строку
if(!pstr){cout<<"No memory"; exit(1);}
fflush(stdin); // после ввода числа очищаем поток ввода
cout<<"vvedi stroku < "<<n<<" simvolov:"; gets(pstr);
strShow(pstr);
strUpper(pstr);
cout<<"\nrezult: "<<pstr<<endl;
delete [] pstr; // освобождение памяти
system("pause");
}
// Пример 10.7. Определить, есть ли в строке заданный символ.
// Оформить в виде функции.
#include <iostream>
#include <cstring>
using namespace std;
int poisk(char * str, char c);
int main(){
char *st, c;
int p, n;
cout<<" Vvedi n: "; cin>>n;
st = new char[n];
if (!st){ cout <<"No memory"; exit(1); }
cout<<"Vvedi stroku :"; fflush(stdin); gets(st);
cout<<"Vvedi simvol:"; cin>>c;
p = poisk(st, c);
if(p) cout<<"Yes"<<endl; else cout<<"No simvola"<<endl;
delete [] st;
system("pause");
}
int poisk(char * str, char c){ // функция поиска символа
int pr=0;
while (*str)
if((*str++) == c){pr = 1; break;}
return pr;
}