Отвечая на ваши комментарии построчно:
#include <stdio.h>
#include <stdlib.h>
struct Test { char c; } foo;
int main (void) {
struct Test *ar[10];
struct Test *(*p)[] = &ar; //what type of syntax is this *(*p)[]
cdecl.org говорит, что struct Test *(*p)[]
означает declare p as pointer to array of pointer to struct Test
. И, кстати, массив представляет собой массив неизвестного / неопределенного размера, так как в квадратных скобках ничего нет.
*(*p+1) = &foo; // the same (*p)[1] = &foo
//this only works
Вы правы, и да, работает.
p[0][1] = &foo; //the same as *(*p+1)
////1error: invalid use of array with unspecified bounds
(Я добавил вашу пропущенную точку с запятой.) Обычно вы правы, но в данном случае немного педантизма означает, что это не так. x[0]
не эквивалент *x
, а *(x + 0)
. Обычно они эквивалентны, но когда x
является указателем на что-то неизвестного размера, вам не разрешено использовать на нем арифметику указателя c.
(*(*p+1)+1) = &foo; // the same as p[1][1] = &foo
////2error: lvalue required as left operand of assignment
(Я снова добавил вашу недостающую точку с запятой .) Не совсем. p[1][1]
будет *(*(p+1)+1)
. У вас *
s и круглые скобки неправильные.
//HOW TO make assignment of p[1][1] = &foo and NOT p[0][1] ??
Вы не можете, не зная, насколько велик массив, на который указывает *p
.
return 0;
}