|
Программирование >> Программирование на языке c++
char b[5]; массив из 5 элементов символьного типа Двухмерный массив представляется как одномерный, элементы которого тоже массивы. Например, объявление float[3][4] задает такой массив. По аналогии можно описать и большее число измерений. Имя массива - это константа, которая содержит адрес его первого элемента. В языке С существует сильная взаимосвязь между указателями и массивами. Любое действие, которое достигается индексированием массива, можно выполнить и с помощью указателей, причем последний вариант будет быстрее. Объявление int а[5]; определяет массив из пяти элементов: а[0], а[1], а[2], а[3], а[4]. Если указатель у объявлен как int *у; то оператор у=&а(2]; присваивает указателю у адрес элемента а[2]. В этом случае указатель у+1 адресует элемент а[3], а указатель у-1 адресует элемент лЩ. Здесь автоматически выполняется соответствующее масштабирование для приращения адреса с учетом длины (размера) объекта. Поскольку а - это адрес первого элемента массива, то значения его элементов можно получить и так: *а, *(а+1), *(а+2), *(а+3), *(а-1-4). Пусть задан трехмерный массив: long а[2][3][2]; объявление long а эквивалентно объявлению long int а На рис. П.1 показаны различные способы обращения к элементам этого массива. Здесь стрелка, которая указывает на границу прямоугольника, задает адрес соответствующего элемента, а стрелка, указывающая на внутренний элемент, - значение соответствующего элемента. Между именем массива и соответствующим указателем есть одно важное различие. Указатель - это переменная и у=а; или у+-1-; - допустимые операции. Имя же массива - константа, поэтому конструкции вида а=у; а++; использовать нельзя, так как значение константы постоянно и не может быть изменено. Язык С позволяет инициализировать массив при объявлении. Для этого используется следующая форма: ТИП имя массива[...]...[...] = { список значений }; Рассмотрим пример: char с[2][3] = { a,b/c/d,e/f }; Теперь: с[0][0]=а; с[0][1]=Ь; с[0][2]=с; c[l][0]=d; с[1][1]=е; с[1][2]=Т (в массивах быстрее изменяются правые индексы). В языке допускаются массивы указателей, которые объявляются, например, следующим образом: char *m[5]; Здесь m - массив, содержащий адреса элементов типа char. Язык С не поддерживает отдельный строковый тип данных, но он позволяет определить строки двумя различными способами. В первом используется массив символов, а во втором - указатель на первый символ массива. 1.8. Структуры и объединения. Они задаются ключевыми словами struct и union и используются для описания новых типов данных. 1.9. Спецификатор typedef. Этот спецификатор применяется для объявления идентификатора, который позже можно использовать как имя базового или производного типа. Он задается в виде typedef известный тип новое имя; Применение этого спецификатора рассмотрим на примерах. typedef int i, *j; Здесь задается новое имя i для типа int и новое имя j для указателей на тип int. Теперь можно, например, задать следующие объявления: i а=3; объявление и инициализация цепой переменной а j к=&а; объявление и инициализация указателя к Следующая строка тоже является правильной: typedef i i; здесь задается новое имя i для типа i Рассмотрим другие примеры: typedef char *str; тип str - указатель на символ typedef struct s *р; тип р - указатель на структуру s typedef struct s { /* ... */} ttt; тип ttt - это структура s а[1][2] а[1][1] а[1] а[1][0] *(а[1][0]+4) *(*а[1]+4) +/-++ *(а[1][0]+5) *(*а[1]+5) (**а+10) *(**а+11)
*(а[1][0]+3) *(*а[1]+3) а+9) *(aIl][0]+2) *(*а[1]+2) *(**а+8) а[0][2] а[0][1] а[0] а[0][0]
*(а[0][0]+3) *(*а[0]+3) *(**а+3) *(а[0][0]+2) *(*а[0]+2) *(**а+2) Рис. п. 1. Различные способы адресации и обращения к элементам массива typedef int (*f)(char,int); тип f - указатель на функцию с двумя аргументами типов char и int typedef char (*аа)[10][20]; тип аа - указатель на двухмерный массив элементов типа char Теперь можно рассмотреть такие объявления: str ss; ss - указатель на символ Р fTiV-PCp) new (ttt); выделенная память присваивается ту р f funi, fun2; funi и fun2 - указатели на функции аа al; al - указатель на двухмерный массив типа char 1.10. Функции. Все функции языка С (не С++) являются глобальными. Запрещено определять одну функцию внутри другой. Связь между функциями осуществляется через аргументы, возвращаемые значения и глобальные (внешние) перемен-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |