作业帮 > 综合 > 作业

struct student*fun(struck student *a)怎么解释啊,struct fun(struck

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/05/16 13:38:48
struct student*fun(struck student *a)怎么解释啊,struct fun(struck student *a)对不对?麻烦解释下
struct student*fun(struck student *a)怎么解释啊,struct fun(struck
struck应该是拼写错误吧.
struct student是之前定义的一个结构体
struct student * 是该结构体的指针
struct student * fun(struct student *a); 声明了一个函数,名字叫fun,参数是struct student *,返回值也是struct student *.
struct fun(struct student * a); 编译会报错,struct后面必须 有结构体的名称
再问: struct studentfun(struck student *a)那如果这样呢?我怎么知道什么时候用结构体指针呢??
再答: 你应该是写的struct student fun(struct struct * a)吧? 这样返回值是一个结构体,而不是指针。具体什么时候用指针,看需求了。 不过一般来说对于结构的话,都会返回指针。因为函数调用参数传递都是通过栈来实现的,函数内部的参数实际上是复制了一份调用时传入的参数,也就是说会有内存的拷贝动作。如果直接传结构体,就会复制整个结构,如果结构很庞大,那会大大增加函数调用的开销,一般来说是这种开销是完全没有必要的。而传指针的话就不会带来太多开销,而且在函数内部操作指针的话,可以直接更新之前传入结构的内容。
再问: 有些是这样的,STDfun(struck student *a) STD也表示指结构体类型名,可他并不用指针,到底加上算不算错,我现在都糊涂了,觉得很麻烦啊,麻烦在详细讲解下吧,十分感谢
再答: 不能算错,关键是你要理解c程序在函数调用以及返回值时的动作。 比如下面的代码: int func(int b) { int a = b; return a; } int c = 3; int d = func(c); 这里只是用了int类型,其它类型都是一样的,结构体也是一个自定义的类型。在程序执行的时候,虽然每个变量的值都是3,但是他们都保存在不同的内存位置。 func函数被调用的时候,会把c里的值复制到b中,a是函数内部的局部变量,它的有效期在函数返回的时候就会消失,函数返回的时候,return a,会把a的值复制一份到d中。 如果是指针用作参数,效果会有些差别,比如 int * func (int *b) { int a = *b; *b = 4; return b; // return &a; } int c = 3; int * p = func(&c); int d = *p; 这里函数在调用的时候传的是指针,指针本身也是一个变量,它也是有存储空间有值的,所以,会把c的地址拷贝给变量b,然后在函数里,可以直接操作指针,也可以操作指向区域的数据。返回指针的时候要注意指针指向内容的数据的有效性,比如局部变量a,这里如果返回&a就是有问题的。因为,函数返回的时候只是把a的地址复制给了p,但是a本身所占的空间会在函数结束的时候释放掉。所以在函数结束后引用p就会是非法操作,里面的内容是不确定的。而返回b就没问题,因为b指向的是变量c,他的有效性跟d是一样的。 总结一下:这两种方式的差别就是 方法1不能修改a的内容,函数调用的时候需要拷贝sizeof(a)大小的数据。 方法2能修改a的内容,函数调用的时候需要拷贝sizeof(void *)大小的数据(也就是指针的大小)。 两种方法都是有效的,看使用场景了。 一般大数据结构需要用指针,而小的结构(比如就是个int)就没必要用指针了,可以直接传数据本身。
再问: 太感谢了