Символьные данные и строки
Указатель на void
Например:
void* pv; // указатель на объект произвольного типа
int g(void); // функция без аргументов, равносильно int g();
void f(); // f не возвращает значения
Указатель void* может указывать на объект любого типа, если этот объект объявлен без спецификаторов const или volatile.
Например:
void* malloc(unsigned size); // библиотечная функция –
// аналог оператора new в языке C
void free(void*); //библиотечная функция –
//аналог оператора delete в языке C
void f() // распределение памяти в стиле языка C
{
int* pi = (int*)malloc(10*sizeof(int));
char* pc = (char*)malloc(10);
//...
free(pi);
free(pc);
}
В программе синтаксис: (тип) выражение - используется для задания операции преобразования выражения к другому типу. Следовательно, перед присваиванием pi тип void*, возвращаемый в первом вызове malloc(), преобразуется к типу int.
Для символьных данных в С++ введен тип char.
Описание символьных переменных:
char список_имен_переменных;Пример 63
const char c=’c’; /*символ – занимает один байт, его значение не меняется*/
char a,b;/*символьные переменные, занимают по одному байту, значения меняются*/
const char *s=“Пример строки\n“ ; //текстовая константа
Строка – это последовательность символов, заключенная в двойные кавычки (" ").
Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0' (нулевой символ или нулевой байт, который является признаком конца строки). В записи строки может быть и один символ: "А" (заключен в двойные кавычки), однако, в отличие от символьной константы 'А' (используются апострофы), длина строки "А" равна 2 байтам.
В языке С++ строка – это пронумерованная последовательность символов (массив символов), она всегда имеет тип char[]. Все символы строки нумеруются, начиная с нуля. Символ конца строки также нумеруется – ему соответствует наибольший из номеров.
Количество элементов в таком массиве на 1 больше, чем изображение соответствующей строки, так как в конец строки добавлен нулевой символ '\0' ( рис. 7.1).
Рис. 7.1. Представление строки и символа
Присвоить значение строке с помощью оператора присваивания нельзя, так как для массивов не определена операция прямого присваивания. Поместить строку в символьный массив можно либо при вводе, либо с помощью инициализации:
char s1[] = "ABCDEF"; //инициализация строки
char s2[]={'A','B','C','D','E','F','\0'};//инициализация строки
Операция вычисления размера (в байтах) sizeof действует для объектов символьного типа и строк.
Пример 64 Определение размера строк
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
char s1[10]="string1";
int k=sizeof(s1);
cout<<s1<<"\t"<<k<<"\n";
char s2[]="string2";
k=sizeof(s2);
cout<<s2<<"\t"<<k<<"\n";
char s3[]={'s','t','r','i','n','g','3','\0'}; /*окончание строки '\0' следует соблюдать, формируя в программах строки из отдельных символов*/
k=sizeof(s3);
cout<<s3<<"\t"<<k<<"\n";
char *s4="string4"; //указатель на строку, ее нельзя изменить
k=sizeof(s4);
cout<<s4<<"\t"<<k<<"\n";
system("pause");
return 0;
}
Результат выполнения программы:
string1 10 – выделено 10 байтов, в том числе под '\0'
string2 8 – выделено 8 байтов (7 + 1 байт под '\0' )
string3 8 – выделено 8 байтов (7 + 1 байт под '\0' )
string4 4 – размер указателя