*
: в Си 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;
}
i = (float)i;— Так как переменная слева
i
имеет тип int
, то значение выражения справа (float)i
будет при присваивании преобразовываться обратно в int
.printf("%f", i);
— Область памяти, начинающаяся с адреса, по которому в стек при вызове printf
пемещается значение типа int
переменной i
(и, соответственно, занимающая sizeof (int)
байт) интерпретируется как хранящая значение типа float
(размером sizeof (float)
байт и захватывающая дополнительно посторонний мусор из стека). Т. е. это даже не арифметическое (пусть даже с округлением) преобразование.int main() {
int i = 1;
printf("%f", (float)i); // выводим на экран float
return 0;
}
struct {char *face, *suit;} aCard = {"Three", "Hearts"};
printf("pattern",..., aCard,...);
printf("pattern",..., aCard.face, aCard.suit,...);
aCard.suit
в первом вызове printf
в вопросе) оказывается лишним.printf("%s %s\n", aCard);
Three Hearts