Читайте также:
|
|
home1.rooms = 4; //вот так получаем доступ к переменной
Тут все предельно ясно. Давайте рассмотрим еще один пример программы:
struct database { int rowId; int name; float surname; }; int main() { struct database worker; // объявили переменную-структуру worker.rowId = 1; worker.name = Denis; worker.surname = Sukhoverkhov; } |
Структура с именем database имеет три переменные, rowId, name, surname. Структуру database можно использовать как тип данных для переменной, пример показан в строке 9. Мы создали переменную worker типа database. И теперь, через переменную worker мы можем получить доступ к элементам структуры. Мы можем задать номер строки, имя и фамилию. Доступ к элементам структуры осуществляется через точку. То есть, чтобы поменять значение структуры или считать его, достаточно указать имя перемененной и через точку — элемент структуры. Вы также можете вернуть структуру в качестве возвращаемого значения функции, для этого нужно определить тип возвращаемого значения функции в качестве структурного типа. Например:
struct database functionName(); |
Немного подниму тему объединений — union, по сути это все та же структура, за исключением того, что все переменные занимают один и тот же объем памяти. Когда в программе объявляется union, компилятор выделяет достаточно памяти для крупнейшего типа данных в объединении. Это как огромное хранилище, в котором есть одна большая запись, все остальные — маленькие, и этим маленьким записям никогда не понадобится в полном объеме то место, которое им отводится.
Оператор точка "." также используется и для доступа к элементам объединения — union. В качестве последнего замечания, хочу отметить такой момент, если вы работаете со структурой через указатель, то в качестве оператора доступа к элементам структуры нужно использовать оператор ->, вместо оператора ".". Все остальное остается актуальным и для указателей.
#include <stdio.h> struct instance { int var; }; int main() { struct instance instance1; struct instance *ptrStruct; instance1.var = 12; ptrStruct = &instance1; // указатель на структуру printf("%d\n", ptrStruct->var); // работает как оператор разименования - * getchar(); } |
Вот результат работы программы:
CppStudio.com
Если у вас возникнут какие-то вопросы, задавайте их в комментариях или на форуме.
#
Массивы в C (часть 1)
Массивы — очень полезные сущности, особенно в тех случаях, когда необходимо под одним именем объединить группы переменных одного и того же типа, обращаться к таким переменным можно через целочисленный индекс. Например, всем известная игра крестики нолики может быть представлена в виде массива. Размер поля — 3*3 клетки (левая верхняя ячейка может быть нулевым элементом, а правая нижняя клетка 8-м элементом массива). На самом деле, массивы — это самый эффективный способ для хранения большого количества однотипной информации под одним и тем же названием. Массивы могут иметь абсолютно любой тип данных, включая структуры и классы.
Массив можно представить как набор ячеек:
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
Каждая пара квадратных скобочек — это элемент массива, в каждом элементе массива можно хранить отдельное значение.
Пора приступить к изучению синтаксиса объявления массива:
Мы только что объявили целочисленный массив размером 10 ячеек (мест, в которых значения массива хранятся). Чтобы обратиться к конкретному элементу массива, нужно просто указать имя массива и в квадратных скобках — порядковый номер. Единственно, вам следует знать, что на самом деле первый элемент массива имеет индекс — 0, тогда индекс последнего элемента равен размеру массива минус один. Например, индексы для массива из 10 элементов будут соответствовать этому диапазону: от 0 до 9. Будьте осторожны, никогда не выходите за пределы массива, это может привести к непредсказуемым ошибкам. Но как вы можете применить только что полученные знания? Допустим, вам нужно сохранить строку, но язык Cи не имеет встроенный типа данных для строк, в таком случае мы можем воспользоваться массивом. Например:
Этот код позволит нам объявить массив символов из 10 элементов. И мы сможем сохранить в этот массив данные, которые введет пользователь. Первый входной символ сохраниться в нулевую ячейку, второй символ — в 1-ю ячейку и т. д. Таким образом работать со строками — сравнительно легко, потому что это позволяет работать со строками любой длинны и вся строка хранится в одной переменной. А теперь представьте ситуацию, когда пришлось бы хранить строку не в массиве, а в десятках переменных — это не очень удобно. Кроме того, с массивами очень легко работать в цикле, поочереди перебирая каждый элемент массива:
Давайте посмотрим, что в этой программе происходит. Функция scanf() считывает вводимую пользователем строку. Первый её параметр — %s говорит о том, что необходимо считать строку. Во втором параметре мы не используем амперсанд, так как второй параметр это указатель на первый элемент массива string. То есть имя массива — это указатель на первый элемент массива, запомните это. Так что мы просто передаем массив непосредственно в scanf() без использования амперсанда и это работает прекрасно. Кроме того, обратите внимание, что для доступа к элементу массива, мы просто используем квадратные скобки, внутри которых ставим значение, которое нас интересует. В данном случае, мы перебираем элементы от 0 до 9 и проверяем каждый элемент на равенство символу — a. Обратите внимание, что в данном примере есть один не маловажный момент, если пользователь введет строку размером — более 10 символов, то вся строка не поместится в массив и часть строки будет отброшена. Но вы пока на это не обращайте внимание, более подробно работу строк мы рассмотрим в следующем уроке.
Нарушение границ массива
«Почему вывод программы содержит неправильные значения?» Элементы массива индексируются, начиная с 0, а значит, общая длинна на 1 меньше. Например, если у вас есть десять элементов массива, первый элемент находится в положении нуля, а последний элемент в позиции 9.
В этом коде границы массива уже не нарушаются. #
|