Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Строки и указатели




Рассмотрим следующие два определения:

 

char A[100], C[100];

char *B;

 

Массив А получает память автоматически при обработке определения. Строке, с которой мы хотим связать указатель В, память при обработке определения указателя не выделяется (выделяется 2 байта под сам указатель). Поэтому если далее следуют операторы:

 

gets(A); // оператор верен

gets(B); // оператор не корректен

 

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

1. с указателем В можно связать адрес уже определенного символьного массива: B = &C[0];

2. под указатель В можно выделить память динамически: B = (char*) malloc(100).

С помощью указателей типа char* удобно получать доступ к строкам в виде массивов символов. Типичная задача – обработка слов или предложений, каждое из которых представлено в массиве char в виде строки.

 

Пример:

#include<stdio.h>

#include<conio.h>

main()

{

char* str[4] = {“ABC”, “DEF”, “GHI”, “JKL”};

int i;

clrscr();

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

puts(str[i]);

getch();

return 0;

}

 

Лекция №15

 

Написал Дмитрий
07.11.2008
Классы памяти В языке Си есть инструмент, позволяющий управлять ключевыми механизмами использования памяти и создавать мощные и гибкие программы. Этот инструмент – классы памяти. Каждая переменная принадлежит к одному из четырех классов памяти. Эти 4 класса описываются следующими ключевыми словами: auto- автоматическая, extern - внешняя,static - статическая, register - регистровая. Тип памяти указывается модификатором – ключевым словом, стоящим перед спецификацией типа переменной. Если ключевого слова перед спецификацией типа локальной переменной при ее объявлении нет, то по умолчанию она принадлежит классу auto. Поэтому практически никогда это ключевое слово не используется. В этом просто нет необходимости. Автоматические переменные имеют локальную область действия. Они известны только внутри блока, в котором они определены. Другие функции могут использовать то же имя, но это должны быть переменные, относящиеся к разным блокам. Автоматическая переменная создается при входе в блок функции. При выходе из блока автоматическая переменная пропадает, а область памяти, в которой находилась эта переменная, считается свободной и может использоваться для других целей. Автоматические переменные хранятся в оперативной памяти машины, точнее, в стеке. Регистровые хранятся в регистрах процессора. Доступ к переменным, хранящимся в регистрах гораздо быстрее, чем к тем, которые хранятся в оперативной памяти компьютера. В остальном регистровые переменные аналогичны автоматическим переменным. Регистровая память процессора не велика, и если доступных регистров нет, то переменная становится простой автоматической переменной. Внешняя переменная относится к глобальным переменным. Она может быть объявлена как вне, так и внутри тела функции. Появление ключевого слова extern связано с модульностью языка Си, то есть возможностью составлять многофайловую программу с возможностью раздельной компиляции каждого файла. Когда мы в одном файле опишем вне тела функции глобальную переменную float glob, то для нее выделится место в памяти в разделе глобальных переменных и констант. Если мы используем эту глобальную переменную в другом файле, то при раздельной компиляции без дополнительного объявления переменной компилятор не будет знать, что это за переменная. Использование объявления extern float glob; не приводит к выделению памяти, а сообщает компилятору, что такая переменная будет описана в другом файле. Объявлений переменной как внешней может быть несколько, описание – только одно. При описании статических переменных типа ставится ключевое слово static. Область действия локальной статической переменной – вся программа. Место в памяти под локальные статические переменные выделяется в начале работы программы в разделе глобальных и статических переменных. Однако область видимости локальных статических переменных такая же, как и у автоматических. Значение статических переменных сохраняется от одного вызова функции до другого. Локальные статические переменные инициализируются нулем, если не указан другой инициализатор. Можно описать также глобальную (внешнюю) статическую переменную, то есть описать переменную типа static вне любой функции. Отличие внешней переменной от внешней статической переменной в области их действия. Обычная внешняя переменная может использоваться функциями в любом файле, в то время как внешняя статическая переменная только функциями того файла, где она описана, причем только после ее определения. Все глобальные переменные – и статические, и нестатические – инициализируются нулем, если не предусмотрено другой инициализации. В таблице 10 приведены область действия и продолжительность существования переменных разных классов памяти.   Таблица 10 Область действия и продолжительность существования переменных разных классов памяти  
Класс памяти Ключевое слово Время существования Область действия
Автоматический auto Временно Блок
Регистровый register Временно Блок
Статический локальный static Постоянно Блок
Статический глобальный static Постоянно Файл
Внешний extern Постоянно Программа

 

В программе может быть описано несколько переменных с одним и тем же именем. Конечно, в разных блоках.

Пример [программа pr_35, p_35]:

Файл p_35.cpp

 

void func(void)

{

extern int k; // global extern

printf(" KK = %d ", k);

}

Файл pr_35.cpp

#include <stdio.h>

#include <conio.h>

#include "extern.cpp"

 

int k = 1; // global

 

void f(void);

 

int main(void)

{

int k;

clrscr();

for(k=0; k<5; k++)

f();

func();

getch();

return 0;

}

 

void f(void)

{

//int k = 1; // auto

//static int k = 1; // static

printf("k = %d ", k);

k+=2;

}

 

Модификаторы типа функций являются особенностью систем программирования в операционной системеMS DOS. Их три: pascal, cdecl и interrupt.

Модификаторы pascal, cdecl сообщают компилятору, что передача параметров функции должна быть организована соответственно как в языке Си или Паскаль. Необходимость в этом возникает если вы хотите программу на языке Си использовать вместе с программой на языке Паскаль.

Если же вы хотите все функции, кроме одной, компилировать с передачей параметров, как в Паскале, то можно в интегрированной среде установить соответствующую опцию. Для функции, параметры которой вы хотите передавать так, как принято в Си, установите перед типом этой функции модификатор cdecl.

Модификатор interrupt сообщает компилятору, что функция с этим модификатором будет осуществлять обработку прерываний. Обычно этот модификатор используется при создании резидентных программ.

 




Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 432; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




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