Хотя указатель char* mи массив charm[100]
– переменные разных типов, имя массива рассматривается транслятором как
указатель на начальный элемент массива. Адресные выраженияm[n] и *(m + n) эквивалентны.
Замечание. Из эквивалентности адресных выражений следует:
m[n] <=>
*(m + n) <=> *(n + m) <=>n[m]
т.е. обратиться к элементу массива m[n] можно
и формате n[m].
Пример. Скопировать содержимое массива A в массив B.
int a[]={1,2,3,4,5,6,7,8,9}, B[9]; int i; // 1-йспособ, самыйпонятный for (i = 0; i < 9; i++) B[i] = A[i];
// 2-йспособ for (i = 0; i < 9; i++) *(B + i) = *(A + i);
// 3-йспособ int*a,
*b; for (a = A, b = B, i= 0; i < 9; i++) *(b++) = *(a++);
Вычитание указателей имеет смысл, только если оба они указывают на элементы
одного массива. Связь между массивами и указателями распространяется и на двумерные массивы, m[i][j] означает то же самое, что *(*(m + i) + j).
Замечание. Пусть массив определен как intm[3][4]. В соответствии с арифметикой указателей транслятор
вычисляет адресное выражение *(*(m + i) + j) или, что то же самое, m[i][j] так:
(адрес начала массива m)
+ i*(размер одномерного
массива из 4-х целых чисел) + j*(размер
целого числа).
Отсюда следует, что для вычисления адресного выражения m[i][j] транслятору
необходимо знать лишь вторую размерность массива, но не первую.
Выражение m[i] рассматривается транслятором
как имя одномерного массива из 4-х целых чисел, поэтому все следующие выражения
правильны и обозначают одно и то же, а именно, m[2][3]: *(m[2]+3), (*(m+2))[3], 3[m[2]], 3[2[m]].
Источник: http://www.cplus-plus.ru |