Контакты

Достижения

Все достижения (6)

Наибольший вклад в теги

Все теги (83)

Лучшие ответы пользователя

Все ответы (254)
  • Можно ли на C заменить X[i][j] на *((X+i)+j)?

    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;
    }
    Ответ написан
    Комментировать
  • Столкнулся со странным утверждением в книге по C. Так какой же адрес у переменной массива?

    wisgest
    @wisgest
    Не ИТ-специалист
    array == &array[0]
    &array численно равен array, но имеет другой тип.
    Ответ написан
    Комментировать