русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Получение значения переменной.


Дата добавления: 2015-06-12; просмотров: 506; Нарушение авторских прав


Мы можем получить значение, которое хранится по адресу, записанному в указателе. Для этого используется оператор «*». Ага, снова эта пресловутая звездочка. Догадайтесь, куда она записывается? Ага, именно туда, перед именем указателя. Вот такие чудеса творятся иногда. Надо посмотреть на примере.

Давайте немного изменим Листинг 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+, используя кнопки социальных сетей расположенные ниже.



<== предыдущая лекция | следующая лекция ==>
Присвоение указателю адреса. | Урок 17. Создание динамического массива. Указатели и практическое применение.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.103 сек.