struct Student //定义的结构体类型 相当于int 、float这些类型 ,是用户自定义的
{
char name[20];
int num;
float score;
}s[5] = { { "nijiushidiao", 1, 99 }, { "nijiuqua",2, 89 } }, *p = s; /* s[5]、*p这些是这种类型的变量名,
他在函数体外面所以相当于全局变量,如果在此分号前没有定义变量那么他仅仅就是用户定义的的类型,不为他分配
内存空间,如:
struct student
{
int num;
char name[20];
};系统就不会给他分配内存空间*/
int main()
{
printf("1 %f\n",p->score);/*打印99.000,相当于(*p).score,p存的是s结构体数组的首元素的地址,这个元素
包括第一个学生的所有信息(name,num,score),因此*p使进入结构体,此时*p不像二维数组那样还是地址,还可以
做*(*p+1)这样的运算,因为结构体里面的数据类型不一致,加一不知道加到哪,所以在结构体里面*p就是进入
结构体并且看到了第一个学生的所有信息并且通过.score将该学生的某一项信息打印出来*/
printf("2 %d\n", *s);//打印一个奇怪的数字,具体这个数字怎么来的有待研究,理解方法同上
printf("3 %d\n",sizeof( s));//打印140,在sizeof下s代表整个结构体数组的大小
printf("4 %d\n",sizeof(s[0]));//打印28,第一个学生s[0]的大小
printf("5 %d\n", s);//打印18644992,首元素(包括第一个学生所有信息)的地址
printf("6 %d\n", s+1);//打印18645020=18644992+28,加一加到下一个学生s[1]的地址
printf("7 %d\n", &s);//打印18644992,代表整个结构体数组的地址加一就跳过所有学生,就到s[5]的下一个
printf("8 %d\n", &s + 1);// 打印18645132=18644992+140
printf("9 %d\n", &(p->name));//打印18644992,代表首位学生的name的地址,虽然值都一样但意义不一样
struct Student tmp = s[0];
*p = s[1];
s[1] = tmp;
printf("%s--%d\n", p->name, p->num);//打印第二个学生的学号与姓名
printf("%s--%d\n",(p+1)->name,(p+1)->num);//第一个学生,代表在结构体里面可以将整个学生信息一次性交换,而一般数组则不行
getchar();
}
结构体数组与指针
最新推荐文章于 2023-05-09 21:53:15 发布