Связь между адресной арифметикой и индексированием массивов



Значение переменной или выражения типа массив есть адрес нулевого элемента.

Пример 4:

int a [5], * pa, * pm

pa = & a [0]; pm = a; / * эквивалентны записи * /

Поэтому эквивалентны следующие выражения:

a [i] * (a + i)

& A [i] a + i

pa [i] * (pa + i)

Указатели по обычные переменные можно объединять в массив.

Различие между именем массива и указателем (в роли именi массива)

Указатель - переменная, поэтому допустимо использовать указатели в выражениях со сменными.

Допустим :

int * pa; int a [5]

pa = a; / * -> на a [0] * /

pa + +; / * -> на a [1] * /

Недопустимо :

int * pa;

int a [5];

a = pa;

а + +;


- Изменять начальный адрес массива невозможно.
- Имя массива не является переменной.

В Си нет операций над массивами в целом.

Буквенные указатели

В Си нет строчного типа данных.
Строчная константа - это массив букв (символов).

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

Пример 5:

char * pstr;

pstr = "с указателем";

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

Так же строка может быть промоделирован как буквенный указатель.
Различия между декларациями строк как массива и с помощью указателя

Пример 6:  

char s_str [] = "як_масив"

char * p_str = "з_покажчиком"

 

 

s_str:
- элементы s_str могут меняться;
- но s_str всегда ссылается на то же место в памяти; р_str: - при изменении указателя он будет ссылаться на другое р_str = "изменили";


Потому что в Си нет операций обработки массивов в целом, нельзя выполнять операции со строками.

Недопустимо:

 

s_str = "изменили";

Все функции для работы со строками в размещенные в бiблiтечному файле .

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

Дано текст, в котором фраза "номер рисунка" находится над рисунком, а название рисунка - под ним.
Превратить тест, чтобы "номер рисунка" находился под ним, а название - над рисунком.

1) Выбираем способ подачи текста
Строки текста - переменной длины , следовательно, нельзя текст представить следующим образом: V [N] [M] (!)
-> Використуемо массив указателей на тип данных char :

Пример 7:  

# 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 + +);

 

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

Пример 8:

/ * Массив наименований месяцев года * /

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

             "Май", "июнь", "июль", "август", "сентябрь",

                   "Октябрь", "ноябрь", "декабрь"};

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

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

 

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

Пример 9:

/ * Массив праздничных дней * /

int mpr [2] [7] =

 = {{1, 7, 8, 1, 2, 9, 26, 24}, / * дни * /

{1, 1, 3, 5, 5, 5, 6, 8} / * месяца * /

};

/ * Обращение к элементам: * /

......

d_may1 = mpr [0] [3];

m_may1 = mpr [1] [3];

 

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

Пример 10:

/ * 2 способа подачи двомiрних массивов * /

1) char a [3] [4];

2) char * b [3];

В первом случае массивы, которые являются строками матрицы, должны быть все обинаковой длины.

В втором случае строки могут быть разной длины, в этом заключается преимущество в работе с указателями. Чаще всего этим способом пользуются в работе со строками.

Функции обработки строк

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

strlen | strcat | strcpy | strcmp

strlen (S), S-строка (определяет длину строки) - количество информационных символов (без \ 0)

Пример 11:

int l;

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

strcat (S1, S2) / * S1 + = S2 (конкатенация) * /
В строку S1 конкатенуеться копия строки S2, результат возвращается через имя функции. S1-зминютьеся, S2-не меняется.

Пример 12:

char a [30] = "Белеет", / * a = "Белеет" * /

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

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

                   / * B = "парус" * /

strcpy (S1, S2) / * S1 <= S2 (S1 = S2) * /
Строка S2 копiюеться в строку S2.

Пример 13:

char a [30] = "Белеет", / * a = "Белеет" * /

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

char * c;

strcpy (c, a); / * c = "Белеет" * /

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

strcmp (S1, S2) / * Сравнение строк в лексiко-графическом порядке * / strcmp (S1, S2) = 0, если S1 = S2 strcmp (S1, S2) <> 0, иначе:

 

  • > 0, если S1> ​​S2
  • <0, если S1 <S2
  • = 0, если S1 = S2

Пример 14:

int r1, r2, r3;

char a [] = "ПС-08А", / * a = "ПС-08А" * /

b [] = "ПС-08б"; / * b = "ПС-08б" * /

char * c;

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

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

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

Функции проверки свойств символов

Функции проверки свойств символов содержащихся в библиотецi ctype.h

Все функции имеют тип int (отвечают на вопрос "Есть ли символ ...?"). Результат функций равен 1, если "символ есть ...", i равен 0 иначе.

Эти функции имеют аргумент типа int .

isdigit | isalpha | isalnum | isupper | islower

isdigit (c) - проверяет, является ли аргумент c цифрой (0:9).

isalpha (c) - проверяет, является ли аргумент c латинской буквой.

isalnum (c) - проверяет, является ли аргумент c латинской буквой или цифрой.

isupper (c) - проверяет, является ли аргумент c большой латинской буквой (верхней регистр).

islower (c) - проверяет, является ли аргумент c малой латинской буквой (нижний регистр).

Пример 15:

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 = slower (c4); / * r5 = 1 * /

Функции преобразования строк

Функции преобразования строки в число содержащихся в библиотецi stdlib.h

atof | atoi | Atol | strtod | strtol | strtoul
Эти функции преобразуют строку цифр в целые значения и значения действительны.

atof - преобразует строку, представляющая действительное число, в значение типа double и возвращает значение этого типа.
Если аргумент функции не может быть преобразован (например, если первый символ строки не является цифрой), поведение функции atof не определено.

Пример 16:

# Include <stdlib.h>

main ()

{

double d;

d = atof ("99.0"); / * d = 99.0 * /

}


atoi - преобразует аргумент (строку цифр), что представляет целое число, в значение типа int и возвращает значение типа int. Если аргумент функции не может быть преобразован, то поведение функции atoi не определено.

Пример 17:

# Include <stdlib.h>

main ()

{

int i;

i = atoi ("2593"); / * i = 2593 * /

}


atol - преобразует аргумент (строку цифр), что представляет собой число типа длинное целое, в значение типа Long и возвращает занчение типа long .
Если аргумент функции не может быть преобразован, то поведение функции atol не определено. Если для хранения типа int и типа long используется 4 байта, то функции atoi и atolработают идентично.

Пример 18:

# Include <stdlib.h>

main ()

{

long l;

   l = atol ("1000000"); / * l = 1000000 * /

}


strtod - преобразует последовательность символов, представляющих действительное число в значение типа double . Эта функция имеет два аргумента: строку (char *) и указатель строки.
Строка содержит последовательность символов, которые должны быть преобразованы в тип double .
Указателю присваивается адрес символа, является первым символом строки - остатка после преобразования части строки.

d = strtod (string, & stringPtr);


strtol - преобразует последовательность символов, представляющих целое число, в значение типа long . Эта функция имеет три аргумента: строку (char *), указатель строки и целое число.
Строка содержит последовательность символов, которые должны быть преобразованы.
Указателю присваивается адрес символа, является первым символом строки - остатка после преобразования части строки.
Целое число определяет основу счисления , по которой производится преобразование.

x = strtol (string, & remainderPtr, 0);


strtoul - преобразует последовательность символов, представляющих целое типа unsigned long в значение типа unsigned long . Эта функция работает аналогично strtol .

x = strtoul (string, & remainderPtr, 0);  

 


Дата добавления: 2020-04-25; просмотров: 81; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!