- •Занятие 1.Выбор среды программирования. Первая программа!
- •Резюме урока:
- •Задание для практической работы .
- •Занятие 2.Стандартные типы данных. Переменные. Основы ввода и вывода данных.
- •Стандартные функции ввода/вывода данных языка Си.
- •Резюме урока:
- •Задание для практической работы.
- •Переменные и типы данных.
- •Проверь себя:
- •Проверь себя:
- •Как сохранить что-то в перменной?
- •Как объявить переменную?
- •Домашнее Задание
- •Занятие 3. Ввод и вывод данных. Справочники функций.
- •Символьный ввод и вывод данных.
- •Функция putchar.
- •Функции форматного ввода и вывода данных printf и scanf.
- •Спецификаторы формата:
- •Модификаторы формата
- •Управляющие последовательности
- •Резюме урока:
- •Задание для практической работы:
- •Занятие 4. Арифметические выражения и стандартные математические функции. Приоритет операций. Инкремент. Декремент.
- •Оператор присваивания. Арифметические выражения.
- •Операторы инкремента и декримента.
- •Сокращенный вид записи арифметических выражений.
- •Стандартная бибиотека математических функций math.H.
- •Приоритет операций.
- •Резюме урока:
- •Задание для практической работы
- •Занятие 5.Управляющая конструкция if-else. Логические операторы и выражения.
- •Операторы соотношений и логические выражения.
- •Управляющая конструкция if - else.
- •Логические операторы. Сложные условия.
- •Приоритет логических операций.
- •Задание для практической работы:
- •Занятие 6. Оператор множественного выбора switch.
- •Инструкция switch.
- •Резюме урока:
- •Задание для практической работы:
- •Занятие 7.Циклические конструкции. Цикл со счетчиком for.
- •Циклическая конструкция for. (Цикл for)
- •Первое выражение - инициализация счетчика.
- •Второе выражение - условие.
- •Третье выражение - изменение счетчика.
- •Занятие 8.Оформление кода программы на Си.Уроки программирования для чайников.Язык Си.
- •Имена и способы описания переменных.
- •Оформление логических блоков и запись лесенкой.
- •Оформление арифметических выражений и сложных условий.
- •Использование комментариев.
- •Резюме урока:
- •Занятие 9.Циклические конструкции. Циклы while и do-while.
- •Цикл while.
- •Цикл do-while.
- •Зацикливание.
- •Задание для практической работы.
- •Занятие 10. Функции определяемые пользователем.
- •Как задать функцию.
- •Заголовок функции.
- •Тело функции.
- •Резюме урока:
- •Задание для практической работы.
- •Занятие 11. Одномерные массивы.
- •Резюме урока:
- •Задание для практической работы:
- •Занятие 12. Простейшие алгоритмы для работы с одномерными массивами.
- •Поиск минимального элемента в массиве.
- •Сортировка массива.
- •Задание для практической работы.
- •Занятие 13. Азы работы с файлами и потоками. Случайные числа.
- •Занятие 14. Строки и символьные массивы в языке Си.
- •Объявление и инициализация строк.
- •Ввод и вывод строк.
- •Функция gets().
- •Функция fgets().
- •Функции puts(), fputs().
- •Задания для самостоятельной практической работы.
- •Урок 15. Некоторые стандартные функции работы со строками.
- •Функция strlen().
- •Функции сравнения строк.
- •Функции изменения регистра строки.
- •Функции объединения строк.
- •Занятие 16. Указатели.
- •Перевод числа из шестнадцатеричной системы счисления в десятичную.
- •Перевод числа из десятичной в шестнадцатеричную систему счисления.
- •Переменные и их адреса.
- •Указатели.
- •Объявление указателя.
- •Присвоение указателю адреса.
- •Получение значения переменной.
- •Урок 17. Создание динамического массива. Указатели и практическое применение.
- •Занятие 18. Передача одномерных массивов в функцию. Возвращение массива из функции.
- •Первый случай. Передача в функцию статического массива.
- •Второй случай. Передача в функцию динамического массива.
- •Задание для практической работы:
- •Занятие 18. Передача одномерных массивов в функцию. Возвращение массива из функции.
- •Первый случай. Передача в функцию статического массива.
- •Второй случай. Передача в функцию динамического массива.
- •Занятие 19. Двумерные массивы.
- •Что такое двумерный массив?
- •Как работать с двумерным массивом?
- •Как работать с отдельным элементом массива.
- •Задание для практической работы:
- •Зачем нужны двумерные массивы?
- •Практическое задание.
- •Занятие №20. Некоторые особенности цикла for. Оператор последовательного вычисления.
- •I присвоить 0;
- •Занятие 21. Заголовочные файлы.
- •Как создать заголовочный файл.
- •Как поделиться своей программой с друзьями.
- •Практическое задание.
- •Дополнительные материалы к уроку.
- •Занятие 22. Препроцессор. Директивы препроцессора.
- •Чем занимается препроцессор?
- •Как работает препроцессор?
- •Как посмотреть код программы, после обработки препроцессором.
- •Урок 23. Структуры в языке Си.
- •Int book_date[100]; // дата издания
- •Int book_pages[100]; // количество страниц
- •Что такое структура.
- •Int date; // дата издания
- •Int pages; // количество страниц
- •Как объявить структурную переменную (структуру).
- •Как инициализировать структуру.
- •Как обращаться к полям структуры.
- •Практическое задание:
- •Автор||Название||Год издания||Прочитано||Количество страниц||Стоимость
Указатели.
Во-первых, для хранения адресов существует специальные переменные, которые называются указателями. Таким образом, мы вплотную подобрались к теме нашего урока - к указателям.
Указатель – переменная, предназначенная для хранения адреса в памяти.
Обычно, указатели используют, чтобы хранить адреса других переменных.
Объявление указателя.
Указатель, раз это переменная, должен как-то объявляться. Делается это почти что также как и обычно.
int * p_a;
Сначала указывается тип переменной, которая будет храниться в памяти, по адресу указателя. Далее следует специальный символ «*» (звездочка), которая и указывает на то, что мы собираемся объявить не просто переменную типа int, а указатель на переменную типа int. После звездочки пишут имя указателя. Ну и естественно заключительная точка с запятой.
В нашем примере, мы объявили указатель с именем p_a, который будет указывать на переменную типа int. Кстати, обычно, чтобы не путать указатели с другими переменными, в их имена добавляют какой-нибудь отличительный знак. Например, я вот добавляю обычно “p_”. Когда я вижу в своей программе переменную, имя которой начинается с этих символов, я точно знаю что это у меня указатель. Кроме того, если программа большая, я помимо этого указывают после «p» ещё и тип переменной для типа int - i, для float – f, для char – с и так далее, получается что-то типа pi_a. Это сразу говорит мне, что это указатель, который ссылается на переменную типа int.
Присвоение указателю адреса.
Давайте перепишем Листинг 16.2, используя указатели.
Листинг 16.4
#include <stdio.h>
int main (){
int a,b,*pi_a, *pi_b;
pi_a=&a;
pi_b=&b;
printf ("adres peremennoi a %#x\n", pi_a);
printf ("adres peremennoi b %p\n", pi_b);
return(0);
}
|
Рис.8. Пример хранения адреса переменной в указателе. |
Как видите, после объявления с указателем можно работать так же, как и с обычной переменной. Ему можно присвоить некоторый адрес, используя оператор «=».
И заметьте, для вывода указателя можно использовать специальный спецификатор вывода «p».
Получение значения переменной.
Мы можем получить значение, которое хранится по адресу, записанному в указателе. Для этого используется оператор «*». Ага, снова эта пресловутая звездочка. Догадайтесь, куда она записывается? Ага, именно туда, перед именем указателя. Вот такие чудеса творятся иногда. Надо посмотреть на примере.
Давайте немного изменим Листинг 16.4. Добавим переменным значения и попробуем получить их, используя указатели.
Листинг 16.5
#include <stdio.h>
int main (){
int a=3, b=0, *pi_a; //объявляем переменную a
//и указатель на переменную типа int
pi_a=&a; // присваиваем указателю адресс переменной а
*pi_a=b; // записываем в память, по адресу который хранится в указателе
// значение переменной b
printf ("adres peremennoi a %#x\n", pi_a);
printf ("znachenie po adresu zapisannomy v pi_a %d\n", *pi_a);
return(0);
}
|
Рис.9. Использование указателей для обращения к значениям переменных,на которые они ссылаются |
Как видите, используя запись *pi_a можно обращаться с указателем, как с переменной соответствующего типа. В нашем случае, как с переменной типа int.
Еще раз обсудим звездочку в указателях.
Если звездочка стоит перед именем в объявлении переменной, то в этом случае она означает, что объявляется указатель.
Если звездочка встречается внутри программы, то в данном случае, она указывает на то, что мы обращаемся к ячейкам памяти, на которые ссылается указатель.
Еще раз внимательно перечитайте предыдущий пункт. Он очень важен, вам необходимо в этом разобраться. Задавайте вопросы в комментариях, если вам что-то непонятно. С этим обязательно нужно хорошо разобраться.
Есть еще один специальный указатель. Он имеет свое особое название – нулевой указатель NULL. Нулевой указатель не ссылается никуда. Он используется, чтобы обнулять указатели. Посмотрите на следующую программу.
Листинг 16.6
#include <stdio.h>
int main (){
int a=3,*pi_a;
pi_a=&a; // присваиваем указателю адресс переменной а
printf ("adres peremennoi a %#x\n", pi_a);
pi_a=NULL;
printf ("adres peremennoi a %#x\n", pi_a);
return(0);
}
|
Рис.10 Нулевой указатель |
Это почти все основные действия, которые можно производить с указателями. Есть еще одно интересное свойство, мы его коснемся чуть позже.
Один небольшой пример. Помните занятие про функции? Или недавнюю небольшую головоломку в группе во Вконтакте. Кто не помнит, вот вам картинка.
|
Рис.11 Простенькая головоломка. Что выведет представленная программа? |
Нам известно, когда мы передаем переменные в функцию, то передаются не сами переменные, а их копии? Иногда нам это вовсе не нужно. Иногда удобно сделать так, чтобы значения все-таки изменялись. Для этого, нужно передавать в функцию не переменную, а указатель на неё.
Давайте перепишем программу с картинки, чтобы она работала так, как и предполагается.
Листинг 16.7
#include <stdio.h>
void obmen (int *pi_a, int *pi_b){
//принимаем указатели на переменные типа int
int temp;
temp=*pi_a;
*pi_a=*pi_b;
*pi_b=temp;
}
int main (){
int x=5, y=10;
obmen(&x,&y);
// ВНИМАНИЕ!передаем адреса, так как функция obmen принимаем указатели
printf ("Posle x=%d y=%d\n",x,y);
return(0);
}
|
Рис.12 Пример работы программы с указателями |
Как видите, теперь работает как надо. Если вы внимательно разобрались с началом урока, то проблем с этой программой возникнуть не должно. Если вопросы есть, задавайте в комментариях. Я постараюсь все вам разъяснить.
Подробный урок о том, зачем нужны указатели.
И это еще не все возможности указателей. Следующее занятие снова будет посвящено указателям. Их связью с массивами и строками.
Отдельного домашнего задания не будет. Хорошенько разберитесь с этим занятием. Вам должна быть тут понятна каждая строчка. Если интересно, можете потренироваться переводить числа из десятичной системы счисления в шестнадцатеричную, и обратно. И раз уж мы учимся программировать, то напишите для этого программу. =)))
Если вам понравился этот или другие уроки, расскажите пожалуйста о них, своим друзьям Вконтакте,Facebook,Google+, используя кнопки социальных сетей расположенные ниже.
