结构体指针作为返回值(函数可以返回指向结构体变量的指针)
函数返回类型已经确定,但还需要返回一个结构体指针变量,怎么办?
既然返回类型已经确定,还要返回一个结构体指针变量,当然只有用一个指针作为形参传进去了。
int function(myStruct * ptrStruct)//参数别加const
{
int i ;
myStruch * anotherPtr;
........
ptrStuct = anotherPtr;
return i;
}
C语言结构体指针作参数问题
newlist()函数有问题:
1、返回类型应该为struct LIST*;
2、返回值不能为函数的局部变量!因为函数里的局部变量是不保存的,随函数调用结束而消失~
改成如下形式,试试看:
struct LIST * newlist ()
{
struct LIST *plist1 ;
plist1=malloc(sizeof(struct LIST));
plist1-last=0;
return plist1;
}
c语言如何实现 多参数返回 啊
在C语言中,一般情况下函数的返回值是通过函数中的return语句来实现的,每调用一次return语句只能从函数中返回一个值。但在实际很多应用中,我们需要从函数中返回多个值,那我们可以用什么方法实现呢?此时我们可以用三种方法来实现。
方法一:设置全局变量
全局变量是在函数外部定义的全局变量,它不属于任何一个函数,其作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。当我们需要函数返回多个值时,除了函数体中的return语句返回其中一个之外,其它的返回值我们可以通过定义全局变量来处理。因为根据全局变量的特点,在被调用函数中改变了多个全局变量和值,相当于其主调函数全局变量的值也发生了变化,也就相当于返回了多个值。
例如:利用一个函数求出正方形的周长和面积。
#include
double l=0;//定义全局变量l为正方形周长
void f(double a)//定义求面积和周长的函数
{ double s; s=a*a;//求面积
l=6*a;//求周长,并赋给全局变量l
return s;//仅返回面积的值
}
void main()
{ double a,area;
printf(“请输入边长:");
scanf("%f",a);
area=f(a);//面积的值通过调用f函数返回值
printf(“面积为:%5.2lf\n”,area);
printf(“周长为:%5.2lf\n”,l);//周长即为全局变量l在f函数中改变后的值
}
上面的例子即用全局变量实现了函数中返回多值的情况,这种方式易懂。但是全局变量用多了会破坏代码的安全性,结构性,这主要是全局变量在所有函数中都可以使用,从而其值的变化不确定,所以我们要慎用。
方法二:使用数组名或指针作为函数的形参
数组名或者指针实际为地址,而数组一般都包括多个元素,指针也可以指向一组数据的着地址,把数组名或者指针作为函数形参,实际上相当于主调函数的实参与形参共用地址,所以在函数中的数组元素发生改变即是实参也随之改变。也相当于在调用函数时多个值返回给主调函数。
实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。
方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。程序参考代码如下:
#include?"stdio.h"
#include?"conio.h"
void?max_min(int?*ptr,int?n)?/*定义求数组最大值最小值的函数,传递数组指针*/
{int?i,j,k;/*j保存最大值所在位置,k保存最小值所在位置*/
int?*temp;/*用于交换位置*/
*temp=*ptr;
for(i=0;i{
if(*ptr*(ptr+i))/*最大值与第一个元素进行交换*/
{
k=i;
*temp=*ptr;
*ptr=*(ptr+k);
*(ptr+k)=*temp?;
}
if(*(ptr+n-1)*(ptr+i))/*最小值与最后一个元素进行交换*/
{
j=i;
*temp?=*(ptr+n-1);
*(ptr+n-1)=*(ptr+j);
*(ptr+j)=?*temp?;}
}
}
/*调用最大最小值函数*/
main()
{
int?A[6],i;
for(i=0;i6;i++)
?scanf("%d",A[i]);
max_min(A,6);
printf("max=%d,?min=%d\n?\n",A[0],A[5]);
getch();
}
调试结果如下:
请输入6个整形数,以空格隔开:
5 8 9 32 -6 4
max=32,min=-6
注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。
方法三:使用结构体指针作为函数的形参
编写返回多个值的C语言函数,可以考虑采用结构体的方式去实现。如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。
实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。
方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入操作即是对实参结构体成员的录入操作,从而实现多个返回值。参考代码如下:
#include?"stdio.h"
#include?"conio.h"
struct?inf{/*定义学生结构体,分别包含成员学号、姓名、班别、总评成绩*/
?char?xh[12];
?char?name[20];
?char?class[15];
?int?chj;
};
main(void)
{
struct?inf?a1;?/*定义学生结构体类型变量*/
void?xxxx(struct?inf?*ptr);
printf("请输入学号,姓名,班别,总评成绩,以空格隔开:\n")?;
xxxx(a1);/*调用函数,以学生结构体类型变量地址作为实参*/
printf("学号:%s,姓名:?%s,班别:%s,总评成绩:%d",a1.xh,?a1.name,a1.class,a1.chj);
getch();
}
void?xxxx(struct?inf?*ptr)/*该函数实现对结构体成员数据的录入操作*/
{
?char?xh1[12],name1[20],class1[15];
?int?chj1;
scanf("%s%s%s%d",xh1,name1,class1,chj1);
?strcpy(ptr-xh,xh1);
strcpy(ptr-name,name1);
strcpy(ptr-class,class1);
ptr-chj=chj1;
?}
C++中如何返回一个struct类型的指针
要返回一个指针,要确保该指针指向的内存空间不会因为函数的返回而释放或失效;C++中struct就类似于class,因此你new一个内存空间就可以返回,切记不可以返回函数内部普通变量的地址。
c语言中函数返回值可以是数组、字符串和结构体吗?
1、ANSI C语言标准,明确规定 数组类型和函数类型不可以做为返回值。
解决这种返回值的方法是通过指针来间接返回,即使用数组指针和函数指针。这可以做为c语言引入指针的另一个理由。
2、字符串是数组的一种,是字符数组,所以同样不可以作为返回值。
3、结构体类型可以做为返回值,C语言设计者当时引入struct结构体的概念,目的是为了增加一种建立C语言新类型的机制, 换句话说它希望通过struct建立的类型,像内置的int float类型一样使用方便。
求解一个c语言函数返回结构体指针的问题
#includestdio.h
#includestring.h
#includeiostream
#includefstream
#includestdlib.h
using?namespace?std;
typedef?struct?point{????????????????????????????//结构体设计
int?A,?B,?C,?a,?b,?c,?id,?n;
}point;
point?*ReadFile(){???????????????
????static?point?ss[110];
????char?data[50]?=?{'\0'};
????int?m1?=?0,?n?=?0,?k,?i;
????for(int?i?=?0;?i??100;?i++){
????????ss[i].id=rand()%10;
????????ss[i].A=rand()%10;
????????ss[i].B=rand()%10;
????????ss[i].C=rand()%10;
????????ss[i].D=rand()%10;
????????ss[i].E=rand()%10;
????????ss[i].F=rand()%10;
????}????
????return?ss;
}
void?main(){
????point?male[110],?female[110],?players[110];
????male?=?ReadFile();
}
ss是局部变量,有效范围只局限于定义ss的函数体内,即只在函数ReadFile里有效,函数返回后,ss就失效了。
你可以在ReadFile里定义ss的前面加上static修饰,表示这个是静态局部变量,静态局部变量的内存有效范围可以全局有效。
static point ss[110];
另外,结构体的typedef定义不完整。