Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Многомерные массивы. 2.Создание указателя на массив

План

1.Одномерный массив

2.Создание указателя на массив

3.Строки

4.Двумерные массивы

5.Массивы строк

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


Массивы

 

Массив – это совокупность переменных одного типа, к которым обращаются с помощью общего имени. Доступ к отдельному элементу массива может осуществляться с помощью индекса. В С все массивы состоят из соприкасающихся участков памяти. Наименьший адрес соответствует первому элементу. Наибольший адрес соответствует последнему элементу. Массивы могут иметь одну или несколько размерностей.

Массивы тесно связаны с указателями.


Одномерный массив

 

Стандартный вид объявления одномерного массива следующий:

 

тип имя_переменной [ размер ];

 

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

 

общее число байт = sizeof (базовый тип)* число элементов

 

У всех массивов первый элемент имеет индекс 0. Поэтому, если написать

 

char p[10];


то будет объявлен массив символов из 10 элементов, причём эти элементы адресуются индексом от 0 до 9. Следующая программа загружает целочисленный массив числами от 0 до 9 и выводит его:

 

#include <stdio.h>

 

int main(void)

{

int x[10];

int t;

 

for(t=0; t<10; ++t) x[t] = t;

 

for(t=0; t<10; ++t) printf(“%d ”, x[t]);

 

return 0;

}

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


Создание указателя на массив

 

Можно создать указатель на первый элемент массива, указав имя массива без индекса. Пусть имеется

 

int sample[10];

 

Можно создать указатель на первый элемент, используя имя sample. Следовательно, следующий фрагмент присваивает переменной p адрес первого элемента sample:

 

int *p;

int sample[10];

 

p = sample;

Можно также получить адрес первого элемента массива с помощью оператора &. Например, sample и &sample[0] приводят к одинаковому результату. Тем не менее в профессиональных программах нет почти нигде &sample[0].

Строки

 

Наиболее типичным представителем одномерного массива являются строки. Хотя С не определяет строкового типа, имеется поддержка строковых операций с помощью функций, имеющихся в любом языке. В С строка определяется как символьный массив произвольной длины, оканчивающийся нулевым символом. Нулевой символ определяется как '\0'. Поэтому необходимо объявлять символьные массивы на один символ больше, чем требуется для хранения самой длинной строки. Например, если необходимо объявить массив s, содержащий десятисимвольную строку, следует написать:

 

char s[11];

 

В результате этого выделяется место в конце строки для нулевого символа.

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

С поддерживает множество функций для работы со строками. Наиболее типичными являются strcpy(), strcat(), strlen(), strcmp() со следующими прототипами:

 

char *strcpy(char *s1, const char *s2);

char *strcat(char *s1, const char *s2);

size_t strlen(const char *s1);

int strcmp(const char *s1, const char *s2);

 

Все функции используют заголовочный файл string.h. Функция strcpy() копирует строку, на которую указывает s2, в строку на которую указывает s1. Функция возвращает s1. Функция strcat() выполняет конкатенацию строки, на которую указывает s1, и строки на которую указывает s2. Она также возвращает s1. Функция strlen() возвращает длину строки, на которую указывает s1. Тип данных size_t определён стандартом для адресов и в настоящее время для большинства машин определяется как беззнаковое длинное целое. Функция strcmp() сравнивает строки s1 и s2. Она возвращает 0, если две строки эквивалентны, значение меньше 0, если строка s1 при лексикографическом порядке идет раньше s2 и значение больше 0, если строка s1 при лексикографическом порядке идет после s2.

Следующая программа демонстрирует использование данных строковых функций:

#include <string.h>

#include <stdio.h>

int main()

{

char s1[80], s2[80];

gets(s1); gets(s2);

printf(“lengths: %d %d\n“, strlen(s1), strlen(s2));

if(!strcmp(s1, s2)) printf(“The strings are equal\n”);

strcat(s1, s2);

printf(“%s\n”, s1);

return 0;

}

Если при запуске программы ввести строки “hello” и “hello”, в результате получится:

 

lengths: 5 5

The strings are equal

hellohello

 

Для многих компиляторов существуют безопасные версии функций strcpy() и strcat() - это strcpy_s() и strcat_s(). Чтобы ими полноценно пользоваться необходимо подключить <string.h> и <errno.h>.

errno_t strcpy_s(char * strDestination, size_t sizeInBytes, const char * strSource);

errno_t strcat_s(char * strDestination, size_t sizeInBytes, const char * strSource);

Вторым параметром в этих функциях идет максимальная длина целевой строки. Функции возвращают значение ноль, если параметры корректны и не ноль, если в параметрах содержится ошибка.

 

Двумерные массивы

 

С позволяет создавать многомерные массивы. Простейшим видом многомерного массива является двумерный массив. Двумерный массив – это массив одномерных массивов. Двумерный массив объявляется следующим образом:

 

тип имя_массива [ размер второго измерения ][ размер первого измерения ];

 

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

#include <stdio.h>

int main()

{

int t, i, num[3][4];

 

/* загрузка чисел */

for(t=0; t<3; ++t)

for(i=0; i<4; ++i)

num[t][i] = (t*4)+i+1;

 

/* вывод чисел */

for(t=0; t<3; ++t) {

for(i=0; i<4; ++i)

printf(“%d “, num[t][i]);

printf(“\n”);

}

return 0;

}

 

В данном примере num[0][0] имеет значение 1, num[0][1] имеет значение 2, num[0][2] имеет значение 3 и так далее. num[2][3] имеет значение 12.

 

Массивы строк

 

В программировании типично использование массивов строк. Например, процессор ввода в базу данных может проверять команды пользователя в строковом массиве. Для создания массива строк используется двумерный массив символов. Левый индекс определяет число строк, а правый индекс – максимальное число символов в каждой строке. Данный фрагмент кода объявляет массив из 30 строк, каждая может содержать до 79 символов включительно:

 

char str_array [30] [80];

 

Доступ к отдельным строкам очень прост – необходимо написать имя массива только с левым индексом. Например:

 

gets(str_array[2]);

 

Данная строка эквивалентна

 

gets(&str_array[2][0]);

 

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

Рассмотрим программу, использующую массив как основу простейшего текстового редактора.

#include <stdio.h>

 

#define MAX 100

#define LEN 255

 

char text[MAX][LEN];

/* простейший текстовый редактор*/

int main()

{

register int t, i, j;

 

for(t=0; t<MAX; t++) {

printf("%d: ", t);

gets(text[t]);

if(!*text[t]) break;/*выход по пустой строке*/

}

 

/*посимвольный вывод текста*/

for(i=0; i<t; i++) {

for(j=0; text[i][j]; j++)

printf("%c",text[i][j]);

printf("%c", '\n');

}

 

getchar();

return 0;

}

 

Данная программа осуществляет ввод текста, пока не встретится пустая строка. Затем она отображает каждую строку. В целях иллюстрации она выводит текст посимвольно, с использованием правого индекса.

 

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

 

С позволяет создавать массивы с размерностями больше двух. Многомерный массив объявляется следующим образом:

 

тип имя [ размерN ]…[ размер2 ][ размер1 ];

 

<== предыдущая лекция | следующая лекция ==>
Способность предприятия к обновлению | Особенности движения реальных жидкостей. Распределение давления в живых сечениях потока при установившемся плавно изменяющемся движении


Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных