Символьные данные и строки

Указатель на 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 – размер указателя