结构体数组与指针

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();
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值