Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций_2015.doc
Скачиваний:
36
Добавлен:
03.03.2016
Размер:
532.48 Кб
Скачать

Литерные указатели

Строковая константа, записаная в СИ в виде изображение есть массив литер или символов.

Количество байтов=количество литер+1 (для символа ’\ Ф ’)

ПРИМЕР 10-6

Char * pstr

Pstr=’ С указатели ’

Строка не копируется , а только указатели на массив .

ПРИМЕР 10-7

Char s _str[] =” как массив ”

Char *p_str=” с указателем”

s_str ---Элементы этого массива могут изменяться, но ссылается в оперативную память

p_str --- Это указатель инициализированный

В Си нет операторов для работы с массивом в целом ->недопустимо

10.5 Литерные указатели.

Строковая константа есть массив литер (символов). Количество байтов равно количеству литер +1 (для символа окончания строки \0).

Пример 10.6

char *pstr;

pstr=”с указателем”:

! Различие между декларациями строк как массива и с помощью указателя:

Пример 10.7

char s_str[]=”как массив”; /*11dyte*/

char p_str=”с указателем”; /*13byte*/

с

у

к

а

з

а

т

е

л

е

м

\0

p _str

к

а

к

м

а

с

с

и

в

\0

s_str

Замечание

s_str:

  • элементы s_str могут изменяться.

  • s_str всегда ссылается на одно и то же место в памяти.

p_str:

  • при изменении указателя он будет ссылаться на что либо другое.

!!! В Си нет оператора для работы с массивом в целом (=> недопустимо s_str изменить).

10.6 Массивы указателей.

.

.

.

рис.4

схема

.

.

.

.

.

.

схема

рис.4

.

.

.


Рис.4

схема

схема

Рис.4

Удобно в Си текст, представлять массивом указателей.

Пример 10.9

#define KL 100

int n1,n2;

char *v[KL];

char *temp;

int k;

temp=v[n1];

v[n1]=v[n2];

v[n2]=temp;

k=KL;

while (k-->0)

printf(“%s\n”,*v++);

10.7 Инициализация массива указателей

Пример 10.10:

Char*m_name[]= { ”ошибка”,”январь”,”февраль”,”март”,”апрель”,

”июнь”,”июль”,”август”,”сентябрь”,”октябрь”,”ноябрь”,”декабрь” } ;

/* обращаемся по номеру месяца */

(n<1 || n>12)? m_name[0]:m_name[n];

10.8 Многомерные массивы

Пример 10.11:

/* представляется как массив массивов */

int mpr[2][9]=

{

/* даты */ {1,7,8,1,2,9,24,7,8},

/* месяцы */ {1,1,3,5,5,5,8,11,11}

}

Это даты праздничных дней Украины не привязанных к Церковному

календарю.

Обращение к элементам двумерного массива.

……………………………………………………………………………

d_may1=mpr[0][3];

m_may1=mpr[1][3];

10.9 Указатели вместо многомерных массивов

Пример 10.12:

int a[3][4] /* массив массивов */

0 1 2 3

0

1

2

Int*b[3]

0)

1)

2)

Массив а занимает 24 байта (2 байта * количество элементов)

Массив b занимает первые 6 байт. У массива b не выделена пока память под собственно элементы. Это выделение может быть выполнено 2 способами:

1) при инициализации;

2) либо явно динамическим захватом памяти (см. 2 семестр);

Преимущество 2-го способа состоит в том , что строки в массиве b

могут быть различной длины. Это преимущество используется в литерных массивах.

Пример 10.13:

Берем из примера 10.10 первые 3 Элемента массива и выделяем под них память 2 способами.

1)

/* объявление массива строк как массива массивов char

m_name1[][10]={”ошибка”,”янв.”,”февр.”};

посчитает

компилятор обязательно задается

о

ш

и

б

к

а

\0

я

н

в

.

\0

ф

е

в

.

\0

10 20 30

Количество не использованных байтов:12 (40%)

2)

char*m_name2[]={”ошибка”,”янв.”,”фев.”};

0) ошибка\0

1) янв.\0

2) фев.\0

Библиотека для работы со строками string.h

  1. strlen(s), где s – строка

Определяет длину строки (информационной части, без \0)

int l;

l=strlen(“пример”); /* l=6 */

2 strcat(s1,s2) /* s1+=s2 */

s2 конкатенируется к s1(s1 – меняется, s2 – не меняется)

char a[]=”Белеет ”, /* a~Белеет */

b[]=”парус ”; /* b~парус */

strcat(a,b); /* a~Белеет парус */

3 strcpy(s1,s2)

Копирование строки s2 в s1 (s1 – меняется, s2 – не меняется)

char a[]=”Белеет ”,

b[]=”парус ”;

char *c;

strcpy(c,a); /* c~”Белеет ” */

strcat(c,b); /* c~”Белеет парус ” */

  1. strcmp(s1,s2)

Сравнение строк (в лексико-графическом порядке)

/* Происходит посимвольное вычитание ASCII кодов */

0, если s1=s2

=0, иначе ( разница в коде ):

strcmp=

<0, s1<s2

>0, s1>s2

Пример:

int r1,r2,r3;

char a[]=”ПО96а”,

b[]=”ПО96б”ж

char *c;

strcpy(c,a); /* c~”ПО96а” */

r1=strcmp(a,c); /* r1=0 */

r2=strcmp(a,b); /* r2<0 */

r3=strcmp(b,c); /* r3>0 */

Библиотека проверки символов ctype.h

Тип всех функций - int . Все функции отвечают на вопрос в соответствии с названием функции:

”Являются ли аргумент этой функции тем, что сформулировано в названии?”

Результат : 1 или 0.

Тип аргумента – int !!! Хотя все функции анализируют символы, но символьная константа имеет тип int .(т.к. в константе могут быть символы, которые в ASCII кодируются 2 байтами, а char только

  1. байт.

isdigit( c ) – цифра (0..9) (если цифра, то вернет 1, иначе 0)

isalpha( c ) – буква (латынь)

isalnum( c ) – буква (латынь) или цифра

isupper ( c ) – прописная буква

islower ( c ) – строчная буква

Пример:

int c1=’9’,c2=’s’,c3=’G’,c4=’y’,c5=’=’;

int r1,r2,r3,r4,r5;

r1=isdigit(c1); r1=1

r2=isalpha(c2); r2=1

r3=isalnum(c1); r3=1

r3=isalnum(c5); r3=0

r4=isupper(c3); r4= 1

r5=islower(c4); r5=1

Преобразование символов.

1) atoi(s) - выполняет преобразование строки в int

2) atol(s) - выполняет преобразование строки в длинный int

Строка s – это аргумент содержащий изображение этого числа.

Результатом является целое или длинное целое число.

Пример:

int i;

long l;

i=atoi (”1996”); i=1996

l=atol(”1999000”); l=1999000