c 里面的 结构体是值变量

7 篇文章 0 订阅

c 里面的 结构体是值变量
结构和对象的区别
结构是值类型,所以会影响性能,但根据使用结构的方式,正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和 B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结 构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速 度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。

还有一点:struct 与class本质上应该是相同的,只是默认的访问权限不同(struct默认是public,class默认是private ).之所以要保留struct,很大一部分原因是为了与C兼容吧(C++的一篇文章中是这么说的,我感觉还是有一定的道理). class感觉是应该是struct的扩充,除了可以设置成员的访问类型外,还可以有自己的成员函数,可以继承派生等,好象struct能做的class 都能做,但反过来就不行了,如果没有保护数据的要求,struct能做的我都用struct做,比较简单。

C语言数组,数组作为一个函数的参数传递时,退化成一个指针; 同时,数组无法作为函数的返回值; 也许让数组更不服气的是,数组之间不能直接赋值操作,如下面的操作就是非法的:

int a[10];
int b[10];
a = b;
但是如果数组包装在结构体中,那么就能进行赋值了!相比之下,结构体可以作为函数参数和返回值,这就是一等公民的待遇!

就是说 结构体可以直接赋值给另一个结构体 就算里面有复杂数据类型(比如数组 ) 结构赋值是值类型 里面内容的赋值 而不是引用的赋值

文章参考 http://www.cnblogs.com/hazir/p/C_struct_assignment.html
所以 结构体里面有一个数组 结构体之间赋值的时候里面的数组是内容赋值 不是数组首地址之间的赋值
测试代码:

#include <stdio.h>
#include <stdlib.h>
struct Foo {
    int n;
    double d[2];
    char *p_c;
}foo1, foo2;

int main()
{
    char *c = (char *) malloc (4*sizeof(char));
    c[0] = 'a'; c[1] = 'b'; c[2] = 'c'; c[3] = '\0';

    foo1.n = 1;
    foo1.d[0] = 2; foo1.d[1] = 3;
    foo1.p_c = c;

    foo2 = foo1;     //assign foo1 to foo2
    foo1.n = 2;
    foo1.d[0] = 4; foo1.d[1] = 3;
    printf("%d %lf %lf %s\n", foo1.n, foo1.d[0], foo1.d[1], foo1.p_c);
    printf("%d %lf %lf %s\n", foo2.n, foo2.d[0], foo2.d[1], foo2.p_c);

    return 0;
}

测试结果 结构赋值后修改fool1 并不改变fool2
结构赋值后修改fool1 并不改变fool2

题目链接

题目描述
1041. 考试座位号(15)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:

输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。

输出格式:

对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。

输入样例:
4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4
输出样例:
10120150912002 2
10120150912119 1

代码

#include<cstdio>
#define MAXN 1010
struct Student{
char id[15];
int examSeat;
}testSeat[MAXN],temp;//以试机座位号作为下标来记录考生
int main()
{
    int n,m,test_seat;

    scanf("%d",&n);//考生人数
    for(int i=0;i<n;i++)
    {
        scanf("%s%d%d",&temp.id,&test_seat,&temp.examSeat);

        testSeat[test_seat]=temp;
    }
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d",&test_seat);
        printf("%s %d\n",testSeat[test_seat].id,testSeat[test_seat].examSeat);

    }
return 0;
}

把连续的序号直接当做下标技能get

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值