@tarasrm

Можно ли на C заменить X[i][j] на *((X+i)+j)?

Можно ли заменить X[i][j] на *((X+i)+j) ?
Это одно и тоже?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
@Alexey_Alive
Нет. Вот так можно *((X+i*j)+j)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wisgest
@wisgest
Не ИТ-специалист
Нет, пропущен один знак *: в Си X[i][j]можно заменить на *(*(X + i) + j) (а также на *(X[i] + j) или (*(X + i))[j]).
При этом X может быть (в скобках указано в каких случаях уместна запись X[i][j]):
a) массивом массивов;
b) указателем на массив (являющегося 0-й элементом динамического массива массивов);
c) массивом указателей (на 0-е элементы динамических массивов);
d) указателем на указатель (на 0-й элемент динамического массива указателей на 0-е элементы динамических массивов).

Пример
#define TElem int
#define M 2
#define N 3

TElem a[M][N]               // массив массивов
	 = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
TElem (*b)[N] = &a[0];      // указатель на массив
/*                                       // то же самое,
TElem (*b)[N] = a;              // но короче
*/
TElem *c[M] = {a[0], a[1]}; // массив указателей
TElem **d = &c;             // указатель на указатель

#include <stdio.h>
int main(void) {
	TElem x;
	#define i 1
	#define j 2

	puts("X[i][j]");
	x = a[i][j];  printf("%d\n", x);
	x = b[i][j];  printf("%d\n", x);
	x = c[i][j];  printf("%d\n", x);
	x = d[i][j];  printf("%d\n", x);

	puts("(*(X + i))[j]");
	x = (*(a + i))[j];  printf("%d\n", x);
	x = (*(b + i))[j];  printf("%d\n", x);
	x = (*(c + i))[j];  printf("%d\n", x);
	x = (*(d + i))[j];  printf("%d\n", x);

	puts("*(X[i] + j)");
	x = *(a[i] + j);  printf("%d\n", x);
	x = *(b[i] + j);  printf("%d\n", x);
	x = *(c[i] + j);  printf("%d\n", x);
	x = *(d[i] + j);  printf("%d\n", x);

	puts("*(*(X + i) + j)");
	x = *(*(a + i) + j);  printf("%d\n", x);
	x = *(*(b + i) + j);  printf("%d\n", x);
	x = *(*(c + i) + j);  printf("%d\n", x);
	x = *(*(d + i) + j);  printf("%d\n", x);

	return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы