Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по дисциплине АОП.docx
Скачиваний:
66
Добавлен:
24.04.2019
Размер:
2.91 Mб
Скачать

Имя массива – это константный указатель на его начало.

Из этого утверждения следуют важные соотношения (здесь Т – имя типа):

x[i] эквивалентно *(x+i)

T X[] эквивалентно t *X

Вопрос №52. Определение массива. Способы задания размера массива.

При работе с массивами имеется одно затруднение – размер массива (количество элементов) должен быть известен в момент выделения памяти массиву компилятором. Проблем не возникает в следующих случаях:

  • размер массива задается константным выражением

  • размер массива задается выражением, в которое входят константы и внешние по отношению к блоку, в котором производится определение массива, переменные (и эти переменные получили значения!)

  • размер массива не задается, а определяется списком инициализации

#define N 100

int n1 = 10;

Int main() {

int n = 20;

int a[N], b[30], c[n1];

int g[] = {1, 2, 3, 4};

{

int d[n];

}

}

Вопрос №53. Динамические массивы. Освобождение памяти. Функции calloc и free.

В тех случаях, когда размер массива невозможно знать заранее (например, эта величина вводится человеком), можно использовать динамические массивы, память для которых выделяется динамически системной функцией

Void *calloc(size_t n, size_t r)

где n – количество элементов массива, r – размер элемента в байтах.

Функция возвращает нетипизированный указатель на начало массива.

В программировании встречается неприятная ситуация, которая называется «утечка памяти». Эта ситуация может возникнуть при использовании динамического выделения памяти функцией calloc. Для устранения этой ситуации рекомендуется освобождать неиспользуемую память с помощью функции

Void free(void *p)

где p – нетипизированный указатель, получивший значение в результате вызова calloc.

#include <stdio.h>

#include <stdlib.h>

int sum(int m[], int n) {

int i, s;

for(i=0, s=0; i<n; s+=m[i++]);

return s;

}

Int main() {

int i, n, *z;

Void *p;

printf("input n : "); scanf("%d", &n);

z = (int *)(p = calloc(n, sizeof(*z)));

for(i=0; i<n; i++) z[i] = 2*i+1;

printf("summa = %d\n", sum(z, n));

free(p);

system("PAUSE");

return 0;

}

Лекция 10. Указатели и массивы (продолжение).

Вопрос №54. Символьные указатели. Различие между определением строк с помощью массивов и с помощью символьных указателей.

Язык С не имеет отдельного типа данных для работы со строками символов и они представляются массивами символов char[].

Например, строковая константа “I am a string” будет представлена в памяти символьным массивом из 14 элементов (13 символов+’\0’).

Рассмотрим два способа определения объектов программы, с помощью которых можно работать со строками:

char amessage[] = “I am a string” ; /* массив */

char *pmessage = “I am a string” ; /* указатель */

В первом случае amessage – это массив, занимающий 14 байтов памяти, заполненных символами из строковой константы и каждый символ в этом массиве можно изменять. При этом переменная amessage всегда будет указывать на один и тот же участок памяти и её значение изменить нельзя.

Во втором случае pmessage – указатель размером 4 байта. С его помощью можно также получить доступ к любому символу строковой константы, но изменять символы нельзя. Кроме того, переменная pmessage в дальнейшем может получить другое значение, например, в результате присваивания:

pmessage = “I am another string” ;

Вопрос №55. Массивы указателей (массивы строк).

Так как указатели являются обычными переменными, их можно хранить в массиве. Создадим объект «массив строк», проинициализируем его и выполним перестановку некоторых элементов этого массива:

#include <stdio.h>

#include <stdlib.h>