Определение указателя

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

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 19.12.2013
Размер файла 164,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Учреждение образования

«Белорусский государственный университет

информатики и радиоэлектроники»

Отчет по лабораторной работе №6 на тему: Указатели

Выполнил: студент группы 372304

Немченко Вадим Александрович

Проверила: Толчикова А.С.

Минск 2013

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

Указатель - особый вид переменной, которая хранит адрес элемента памяти, где может быть записано значение другой переменной.

Определение указателя:

имя_типа *имя_переменной;

Пример:

int var, *point;

Здесь var - целочисленная переменная, point указатель на целый тип. Символ * - звездочка определяет тип “указатель”.

Существует операция, неразрывно связанная с указателями. Это унарная операция - операция взятия адреса &. Результат операции & является адрес переменной в памяти. Результат имеет тип «указатель» на тип переменной. Операция & может использоваться практически со всеми типами данных, кроме констант и битовых полей.

Пример:

int var, *point;

point = &variable;

Указатели часто используются для обмена данными с функциями. Функции можно передать столько аргументов, сколько требуется, а вернуть с помощью return можно только одно значение. Когда возникает необходимость вернуть в вызывающую функцию более одного значения, то используются указатели.

Доступа по указателю (разадресации) (*point). Результат операции - содержимое ячейки памяти, на которую указывает point.

Связь между указателями и массивами. Имя массива - это указатель, равный адресу начального массива (1-го байта 1-го элемента массива).

При объявлении int m[10]; одновременно с выделением памяти для десяти элементов типа int, определяется значение указателя m, значение m равно адресу элемента m[0]. Значение m изменить нельзя, т.к. оно является константой. Индексные выражения и адресные эквивалентны: m[i] *(m+i).

Для двухмерных массивов имя является указателем-константой на массив указателей-констант. Элементами массива указателей являются указатели-константы на начало каждой из строк массива.

Динамическое выделение памяти. Одним из способов хранения информации является использование системы динамического выделения памяти языка Си. При этом память выделяется из свободной области памяти по мере надобности и возвращается назад, т.е. освобождается, когда необходимость в ней исчезла. Область свободной памяти, доступной для выделения, находится между областью памяти, где размещается программа, и стеком. Эта область называется кучей или хипом (от англ. heap - куча).

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

Ядром динамического выделения памяти в Си являются функции, объявленные в стандартной библиотеке в заголовочном файле stdlib.h - malloc(), calloc(), realloc() и free().

Рассмотрим каждую функцию в отдельности.

void *malloc(unsigned size)

Функция malloc выделяет из хипа область памяти размером size байт. В случае успеха, malloc возвращает указатель на начало выделенного блока памяти. Если для выделения блока в хипе не хватает памяти, возвращается NULL. Содержимое памяти блока оставляется неизменным. Если размер аргумента равен нулю, malloc возвращает NULL.

void *calloc(unsigned num, unsigned size)

Функция calloc выделяет блок памяти и возвращает указатель на первый байт блока. Размер выделяемой памяти равен величине num*size, т.е. функция выделяет память, необходимую для хранения массива из num элементов по size байт каждый. В случае нехватки памяти для удовлетворения запроса calloc возвращает NULL. Выделяемая память инициализируется нулями.

void *realloc(void *ptr, unsigned size)

Эта функция изменяет размер динамически выделяемой области памяти, на которую указывает *ptr, на size (новый размер). Если указатель не является значением, которое ранее было определено функциями malloc, calloc или realloc, то поведение функции не определено. Это же справедливо, если ptr указывает на область памяти, ранее освобождённую функцией free. Значение size является абсолютным, а не относительным, т.е. задаёт новый размер блока, а не приращение старого. Если size больше, чем размер ранее существовавшего блока, то новое, неинициализированное, пространство памяти будет выделено в конце блока и предыдущее содержимое пространства сохраняется. Если realloc не может выделить память требуемого размера, то возвращаемое значение равно NULL и содержимое пространства, на которое указывает ptr, остаётся нетронутым. Если ptr - не NULL, а значение size равно нулю, то функция realloc действует как free.

Из вышесказанного следует сделать вывод о том, что когда бы размер блока памяти ни подвергся изменению под воздействием функции realloc, новое пространство может начинаться с адреса, отличного от исходного, даже если realloc “усекает” память. Следовательно, если используется realloc, возникает необходимость следить за указателями на изменяемое пространство. Например, если вы создаёте связный список и выделяете при помощи realloc больший или меньший участок памяти для цепочки, то может оказаться, что цепочка будет перемещена. В этом случае указатели элементов будут адресоваться к участкам памяти, ранее занимаемым звеньями цепочки, а не в место их теперешнего расположения. Всегда следует использовать realloc так, как показано ниже:

if(p2 = = realloc(p1,new_size)) p1=p2;

Действуя подобным образом, вам никогда не придётся заботиться, выделялось ли для объекта новое пространство, т.к. p1 обновляется при каждом новом вызове функции, которая указывает на область памяти (возможно, новую).

void free(void *ptr)

Функция освобождает область памяти, ранее выделенную при помощи функций malloc, calloc или realloc, на которую указывает ptr. Если ptr - NULL, то free ничего не выполняет. Если ptr не является указателем, проинициализированным ранее одной из функций выделения памяти, то поведение функции не определено. Заметим, что функция free не располагает средствами передачи ошибки, возможно возникающей при её выполнении, равно как возвращаемым значением.

Задание №1, Вариант №10

В одномерном массиве, состоящем из п вещественных элементов, вычислить:

- минимальный элемент массива;

- сумму элементов массива, расположенных между первым и последним положительными элементами.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

void main()

{ указатель переменная массив

int n=0, i, nomin, nopol, nopol1 ;

double min,sum=0;

printf("vvedite razmer massiva\n");

scanf("%d", &n);

double* a;

a = (double *)malloc(n * sizeof(double));

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

{

printf("vvedite element #%d\n", i+1);

scanf("%lf",a+i);

}

min=*(a+0);

nomin=0;

for (i = 1; i < n; i++)

{

if (min > *(a+i))

{

min=*(a+i);

nomin=i;

}

}

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

{

if (*(a+i) > 0)

{

nopol=i;

break;

}

}

for(i=n; i>=0; i--)

{

if(*(a+i)>0)

{

nopol1=i;

break;

}

}

for(i=nopol+1;i<nopol1; i++)

{

sum=sum+*(a+i);

}

if((nopol==n) || (nopol==nopol1))

{

printf("nety polojitelnih elemntov, ili pervi polojitelni element stoit poslednim\n ili v massive tolko odin polojitelni element\nili v massive 2 polojitelnih elementa\n");

}

else printf("Summa mejdy pervim i poslednim polojitelnim elementov massiva = %lf\n", sum);

printf("Minimalni elemnt massiva = %lf\n", min);

free(a);

getch();

return;

}

Задание 2: Написать программу в соответствии с вариантом, выделив под массив динамически память. Обращаться к элементам массива необходимо используя указатель

10. Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int main()

{

int n,m,znach=0,summa=0, count=0;

int i, j,k,temp=0,y,x,temp1;

printf("vvedite kol-vo stroku\n");

scanf("%d", &n);

printf("vvedite kol-vo stolbcov\n");

scanf("%d", &m);

int **a = (int **)malloc(n* sizeof(int*));

for(i = 0; i < m; i++) {

*(a + i) = (int *)malloc(m* sizeof(int));

}

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

{

for (j = 0; j < m; j++)

{

printf("vvedite element %d stroki %d\n", j+1, i+1);

scanf("%d", (*(a + j) + i));

}

}

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

{

for (j = 0; j < m; j++)

{

printf("%d ", *(*(a + j) + i));

}

printf("\n");

}

int *b;

b = (int*)malloc(m*sizeof(int));

for (j = 0; j < m; j++)

{

znach=0;

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

{

if ((*(*(a + j) + i) < 0) && (*(*(a + j) + i) % 2 !=0))

{

znach=znach+(-1) * *(*(a + j) + i);

}

}

printf("Harakteristika %d stolbca = %d\n", j+1,znach);

for (k=j; k<m; k++)

{

*(b+k)=znach;

break;

}

}

int *o;

for (k=0; k<m; k++){

for (x=0; x<m-k-1; x++)

{

if (*(b+x)>*(b+x+1))

{

temp1=*(b+x);

*(b+x)=*(b+x+1);

*(b+x+1)=temp1;

o = *(a + x + 1);

*(a + x + 1) = *(a + x);

*(a + x ) = o;

}

}

}

printf("Harakteristika stolbcov po vozrastaniy\n");

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

{

printf("Harakteristika %d stolbvca = %d",k+1, *(b+k));

printf("\n");

}

printf("NOVI POly4enni MASSIV\n");

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

{

for (j = 0; j < m; j++)

{

printf("%d ", *(*(a + j) + i));

}

printf("\n");

}

for (j = 0; j < m; j++)

{

summa=0;

count=0;

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

{

if(*(*(a + j) + i)<0)

{

for (y = 0; y < n; y++)

{

summa+=*(*(a + j) + y);

}

printf("Summa %d stolbca, v kotorom ectb hotya bi odin otric element ravna = %d\n", j+1, summa);

break;

}

else count++;

}

if (count==n)

{

printf("V %d stolbce nety otric 4isel\n", j+1);

}

}

free(b);

free(a);

system("pause");

return 0;

}

Размещено на Allbest.ru

...

Подобные документы

  • Виды информационно-вычислительных сетей: локальные, городские, глобальные; их классификация. Разработка программы на языке программирования С: формирование одномерного массива путем замены нулевых элементов на среднеарифметическое, а пробелов - на слова.

    практическая работа [37,5 K], добавлен 20.05.2012

  • Описание особенностей работы с массивами на С/С++. Образование адресного выражения с использованием имени массива или указателя на массив. Написание программы, которая объединяет два упорядоченных по возрастанию массива в один упорядоченный массив.

    лабораторная работа [114,2 K], добавлен 25.03.2019

  • Указатель — переменная, диапазон значений которой состоит из адресов ячеек памяти специального значения - нулевого адреса; применение указателя для доступа к области с динамическим размещением памяти (кучи); выгоды косвенной инициализации и адресации.

    реферат [27,3 K], добавлен 06.06.2011

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

    курсовая работа [44,0 K], добавлен 09.11.2014

  • Инструкции выбора if, switch, цикла for, while, do-while, перехода break, continue, goto и возврата return. Понятие и функциональные особенности указателя, операции над ними, передача параметров функции. Связь массивов и указателей – генерация указателя.

    презентация [94,8 K], добавлен 19.10.2014

  • Запись в массив листа Excel c именем "Эксперимент". Среднее арифметическое значение элементов массива. Вывод диалогового окна. Фрагмент программы, организующий считывание исходного массива в программу для обработки. Адрес ячейки электронной таблицы.

    контрольная работа [1,1 M], добавлен 16.08.2011

  • Подсчет количества отрицательных элементов массива. Изменение исходного массива перемещением всех его положительных элементов в начало с исходным порядком их следования. Вывод на дисплей количества перемещенных элементов. Алгоритм и код программы.

    лабораторная работа [946,5 K], добавлен 23.11.2014

  • Выведение значения элементов массива, которые удовлетворяют неравенству. Подсчет количества отрицательных элементов массива. Изменение исходного массива. Тестирование программы. Проверка её работоспособности. Реакция программы на сообщение об ошибке.

    лабораторная работа [1,3 M], добавлен 23.11.2014

  • Понятие и внутренняя структура показателей, имеющих отношений к основам программирования на алгоритмическом языке СИ: указатели и массивы, передача параметров по ссылке. Исследование примеров программ, иллюстрирующих работу с указателями и массивами.

    лекция [134,4 K], добавлен 26.07.2013

  • Программы линейной структуры. Составление программы, которая по заданному номеру и значению соответствующего элемента вычисляет значение всех остальных элементов треугольника. Формулирование одномерного массива с помощью генератора случайных чисел.

    отчет по практике [1,2 M], добавлен 01.12.2012

  • Принципы построения систем с переменной структурой для управления свободным движением линейных объектов с постоянными параметрами. Разработка модели системы с переменной структурой с применением инструментов Model Vision Studium и Simulink пакета MathLab.

    дипломная работа [4,3 M], добавлен 26.10.2012

  • Структура программы в Турбо Паскале и определение переменной в ней. Понятие идентификатора и его основные ограничения. Операторы присваивания в языке программирования. Процедура ввода-вывода информации. Способы описания массива, обработка его элементов.

    контрольная работа [134,5 K], добавлен 28.09.2012

  • Одномерные числовые массивы, образование элементами целочисленного массива невозрастающей последовательности. Программное нахождение суммы элементов каждой возможной строки матрицы и формирование массива из найденных сумм, вывод массива-результата.

    лабораторная работа [12,8 K], добавлен 09.01.2011

  • Разработка и реализация типовых алгоритмов обработки одномерных массивов на языке Delphi. Максимальный и минимальный элемент массива. Значение и расположение элементов массива. Элементы массива, находящиеся перед максимальным или минимальным элементом.

    лабораторная работа [12,8 K], добавлен 02.12.2014

  • Основы теории численной оптимизации переменной метрики. Создание модуля, содержащего реализацию методов переменной метрики (метод Бройдена, метод Дэвидона – Флетчера – Пауэлла), практическая реализация программы для работы с исследуемым модулем.

    курсовая работа [308,0 K], добавлен 17.03.2013

  • Описание структурного шаблона с именем ZNAK, содержащего элементы NAME, ZODIAC, BDAY. Операции со структурами в языке Си. Подключение графической библиотеки программы. Указатель как переменная, содержащая адрес некоторого объекта в памяти компьютера.

    контрольная работа [342,9 K], добавлен 10.01.2012

  • Спецификатор класса памяти в объявлении переменной, ее область действия как часть программы или исходного модуля. Определение видимости переменных и функций в программе. Продолжительность жизни, виды моделей памяти. Передача параметров и массивов.

    лабораторная работа [62,2 K], добавлен 06.07.2009

  • Программа обработки одномерного массива средствами Visual Basic for Application (VBA) на предмет преобразования, печати, удаления, сортировки, поиска сумм, положительных, чётных элементов, их кратности и дополнения другими элементами и значениями данных.

    контрольная работа [12,3 K], добавлен 07.10.2012

  • Понятие и принцип работы переводческой памяти, под которой понимают лингвистическую базу данных, которая хранит небольшие отрезки текста и их соответствующий перевод. Компоненты Trados. DejaVu - работа в переводческих проектах. Программа WordFisher 4.

    презентация [517,5 K], добавлен 23.05.2016

  • Составление программы для вычисления по двум формулам одной и той же переменной "X". Создание программы, которая по введенному значению аргумента вычислят значение функции, заданной в виде графика. Вывод на экран значения функции, заданной графически.

    курсовая работа [4,9 M], добавлен 14.03.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.