下面定义的结构没有结构名称。而且我无法得到阵列部分。提前致谢。 结构数组中的值是什么意思?
#include <stdio.h>
int main()
{
struct
{
int x,y;
} s[] = {10,20,15,25,8,75,6,2};
int *i;
i = s;
clrscr();
printf("%d\n",*(i+3));
return 0;
}
答案 0 :(得分:10)
现在我们有一个可以回答的问题:
struct
{
int x,y;
} s[] = {10,20,15,25,8,75,6,2};
这声明了一个名为s
的匿名结构数组。每个结构都有两个int
字段。未指定数组大小,因此它将保持初始化列表所需的大小(“初始化列表”是等号后括号括起的数字列表的技术术语。)
教科书中的代码很草率;它没有标记初始化列表中的子结构;这是允许的,但被认为是糟糕的风格。编译器解释它与代码完全相同:
struct
{
int x,y;
} s[] = { {10,20}, {15,25}, {8,75}, {6,2} };
每个括号括起的数字对初始化数组s
的一个元素。第一个数字初始化x
,第二个y
。所以,所有这些都是真的:
s[0].x == 10
s[0].y == 20
s[1].x == 15
s[1].y == 25
等等。
答案 1 :(得分:4)
每当你确实需要引用struct
不超过一次时,在没有给它命名的情况下创建它的变量是有意义的。
在实现它的C语法中是
struct{
/*
.
.your structure members
.
*/
}<variable name>;
在你的情况下s
是
struct
{
int x,y;
}
答案 2 :(得分:3)
您希望从您发布的代码中看到的输出并不完全清楚。如果你希望看到“25”,那么你就是对的。以您尝试的方式访问您的结构成员,而在这种特殊情况下“有效”,除非您确切知道自己在做什么,否则可能非常危险。考虑对您的结构进行以下微小更改:
struct
{
int x;
char y;
} s[] = {10,20,15,25,8,75,6,2};
您认为您的代码现在会得到什么?简单的答案是“它取决于”。什么,你问?在您选择的系统架构中char
的大小。它通常是 8位,但这并不能保证。 ANSI C和C99定义char
如下:
“声明为
char
类型的对象是 大到足以存储任何成员 基本执行字符集。“
它还取决于您的特定编译器如何“对齐”结构的成员。编译器通常会对单词边界上的成员进行对齐,但是,这意味着什么取决于“单词”的大小。结构也可以在字节边界上对齐。关键是,有更好的方法来访问结构中的数据。考虑:
#include <stdio.h>
int main()
{
struct
{
int x, y;
} *ps, s[] = { {10, 20}, {5, 25}, {8, 75}, {6, 2} };
ps = s;
printf( "%d\n", *(ps + 3) );
printf( "%d\n", s[3].x );
printf( "%d\n", (ps + 3)->x );
return 0;
}
在此示例中,ps
被声明为指向未命名结构的指针。完成作业ps = s
后,ps
指向第一个结构成员。如果将{1}添加到ps
,就像ps += 1;
一样,它将指向第二个结构成员,依此类推。因此,在示例中,所有三个printf
语句都打印数字6.你能明白为什么吗?在第一种情况下,*(ps + 3)
,如我们添加到ps
时所示,我们通过结构数组推进指针,使其指向第三个元素。在第二种情况下,s[3].x
,我们引用结构数组s
中的第三个元素,并在该元素中获取x
的值。最后,(ps + 3)->x
,我们像以前一样将{3}添加到ps
,将其作为指向我们结构类型的指针取消引用,我们取值为x
。
还要注意我初始化s
的方式。虽然不需要内括号,但它们的形状很好。如果你有一个更复杂的结构,那么在没有大括号作为指导帮助的情况下进行正确的初始化是非常困难的,对于之后的人来说,将无法阅读。
答案 3 :(得分:2)
你可以拥有一个无名结构,但当然你不能重用它的类型。 s是一个结构数组,直接在声明中初始化。
我怀疑它是正确的语法。
答案 4 :(得分:2)
应该阅读
struct mystructTag
{
int x,y;
}mystruct;
mystructTag mystructlist[]={ {10,20}, {15,25}, {8,75}, {6,2} };
感谢 vulkanino 指出一个小小的人!