Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

79

void _tmain()

{

double a[ROW][ROW]; int i, j, m;

bool flag = true;

for (i = 0; I < ROW; i++)

{

cout << "Введите строку матрицы " << (i + 1) << endl; for (j = 0; j < ROW; j++)

cin >> a[i][j];

}

for(m = 1; m < ROW; m++) for(i = 0; i < ROW - m; i++)

if(a[i][m + i]) flag = false; // Текущий элемент не 0 if(flag) cout << "\nМатрица верхняя треугольная";

else cout << "\nМатрица не треугольная"; _getch();

}

Массивы и указатели

Указателем называется переменная, которая содержит адрес како- го-либо объекта программы. Для работы с указателями используются две основные операции:

&- получить адрес. Эта операция унарная и может применяться только к именам объектов, в частности, к именам скалярных переменных и именам элементов массива, она неприменима, к константам и к выражениям. Например, &x обозначает адрес переменной x, а записи вида &15 или &(а * x + b) использовать

нельзя.

* - извлечь содержимое по адресу, на который указывает операнд. Эту операцию называют иногда "разадресацией". При объявлении переменных звездочка (‘*’) перед именем обозначает, что данная переменная является указателем. Например:

int a, x, *pt;

80

double *qt;

В этом описании a и x являются переменными типа int, pt является указателем на целочисленную переменную, и qt является указателем на данное типа double. Предположим, что в ячейке памяти по адресу 864 хранится число -1.5 и имеется указатель qt, указывающий на эту ячейку памяти. Тогда qt содержит 864, *qt равно -1.5. Применительно к приведенному выше описанию последовательность операций

pt = &a; x = *pt;

выполняет то же, что и x = a;

Компилятор сохраняет информацию о длине элемента данных, к которому этот указатель относится. Таким образом, объявленные указатели:

long *p; char *q; double *t;

связаны с элементами данных, имеющих длину 4, 1 и 8 байт соответственно. Характеристика длины объекта контролируется компилятором.

Объявление указателя обеспечивает выделение памяти только для самого указателя, но не для объекта, на который он будет указывать. Таким образом, длина указателя для данного компьютера всегда постоянна. Способы выделения памяти для объектов, связанных с указателями, будут описаны далее. В литературе и в данном пособии под термином "выделение памяти для указателя" понимается выделение памяти для объекта, с которым связан указатель.

Указатели могут использоваться в выражениях. Принято считать, что знаки операций * и & в выражениях как бы "прилипают" к именам переменных, т.е. эти операции имеют более высокий приоритет относительно других операций. Операция ‘*’ может применяться для

81

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

Например, в приведенном ниже фрагменте программы:

double x, y, z, *pt, *q;

. . .

x = *pt + 1; y = *(pt + 1);

*(q + 1) = x + y;

Выполняются следующие действия:

1.В строке, в которой вычисляется значение переменной x:

извлекается значение из ячейки памяти, адрес которой содержит указатель pt;

к полученному значению прибавляется 1;

результат (полученное число) присваивается переменной x.

2.В строке, в которой вычисляется значение переменной y:

к адресу, содержащемуся в указателе pt, прибавляется 1 (т.е. вычисляется адрес элемента, следующего за тем, на который в данный момент указывает указатель). Другими словами, поскольку указатель относится к данным типа double, то для получения адреса следующего элемента к текущему адресу прибавляется 8 - длина элементов типа double;

содержимое ячейки по вычисленному адресу присваивается переменной с именем y.

3.Наконец, в последней строке определяется сумма величин x и y, полученное значение заносится в ячейку памяти, адрес которой на длину одного элемента данных (т.е. на 8 байт) больше содержащегося в указателе q.

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

82

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

Если указатель связан с некоторым объектом программы, то память оказывается выделенной в следующих случаях:

1.Указатель является именем массива, для которого память выделена;

2.Память для указателя выделена явно с помощью оператора new;

3.Указателю присвоен адрес объекта, память для которого была уже выделена.

Имена массивов являются указателями. Далее указатели, связанные с отдельными элементами данных, будем называть “рабочими”. В литературе указатели, связанные с массивами, называют "указа- телями-константами", имея в виду, что значения таких указателей изменять нельзя, поскольку это приведет к утере адреса массива.

Пусть имеется описание

double w[10], *ptr, x; int i;

Тогда, а указывает на первый элемент (который имеет индекс 0) массива из 10 чисел с плавающей точкой (для этого массива зарезервировано 80 байт памяти). После выполнения приравнивания

ptr = w;

или

ptr = &w[0]; // что эквивалентно ptr = w;

указатель ptr указывает на элемент массива w с индексом 0, и для получения содержимого этого элемента можно использовать любой из перечисленных ниже операторов:

x = *ptr; x = *w; x = w[0];

83

Для обращения к третьему элементу того же массива (имеющего индекс 2) равносильны приведенные ниже операторы:

x = *(ptr + 2); x = *(w + 2); x = w[2];

Приведенные ниже операторы прибавляют к элементу с индексом 0 число 2:

x = *ptr + 2; x = *w + 2; x = w[0] + 2;

Различие между объявлением массива и объявлением указателя заключается в том, что при объявлении указателя резервируется память только для самого указателя, а при объявлении массива кроме памяти для указателя резервируется также память для элементов массива.

При объявлении указателей может применяться атрибут const, который позволяет объявлять указатели на константу и указатели константы. Примеры объявлений:

const char *ptr; // Указатель на константу char const *ptr; // Указатель-константа

Указатель на константу не позволяет изменять константу, даже если этот указатель содержит адрес обычной переменной (другими словами, он допускает только чтение соответствующей ему константы). Если указатель на константу связан с массивом, то значение такого указателя можно изменять для просмотра элементов массива. При объявлении указателя для работы с массивом, имеющего атрибут const, этот атрибут должен быть и у рабочего указателя.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]