Ce sont des constructions très différentes, malgré les apparences. Avec les définitions
double t[2] = {1.0, 2.0};
complexe z = {1.0, 2.0};
dans les deux cas, il y allocation d'un bloc mémoire contenant les deux flottants 1.0 et 2.0 ; mais l'expression t est une constante dont la valeur est l'adresse du bloc alloué, tandis que l'expression z est une variable dont la valeur est la structure elle-même. Ainsi, les tableaux ne peuvent pas être affectés (t = ... est interdit), tandis que les structures peuvent l'être : z = ... est permis, ainsi que ... = z. L'affectation des structures signifie une copie de l'objet, qui peut être coûteuse en temps et en espace pour de grosses structures. Cependant, aussi bien t[0] et t[1] que z.re et z.im sont des variables.
Les structures de C sont l'analogue des enregistrements (record) de Pascal ou d'Ada, et sont étendues par les classes (class ) de C++ ou de Java, construction essentielle pour la programmation orientée objet.
Une autre différence importante entre tableaux et structures est que les éléments d'un tableau sont tous de même type, tandis que les champs d'une structure peuvent être de types distincts. On utilise souvent les structures en tant qu'<< enregistrement >> d'un individu avec des champs pour son nom, sa date de naissance, son adresse, son numéro de téléphone, etc.