重点:一个函数最终只能有一个返回对象(数字,指针……)
但是函数可以通过返回一个指针来返回多个数据
例子:
structStu
{
char *name;
char *sex;
int age;
};
Stuinfo()
{
Stu s;
s.name = "gao";
s.sex ="m";
s.age = 20;
return s;
}
intmain()
{
Stu s1;
s1 = info();
cout<<s1.name<<s1.sex<<s1.age<<endl;
getchar();
return 0;
}
------
-----------------------------------------------
---------------------------------------------------
#include<iostream>
usingnamespace std;
char* fun(void)
{
char *str="hello";//字符串是存放在常量区
return str;//str是字符串在常量区的地址,fun调用后,不会被销毁
}
intmain()
{
char *p;
p=fun();
printf("%s\n",p);
getchar();
return 0;
};
//结果:hello
----
char*str="hello"; 是在动态变量区中开辟了一个可以存放一个指针值的变量,名叫str。同时将原存放于常数空间的字符串"hello"的地址赋给这个指针变量作为初始值。
此时若执行returnstr; 其中的str是指针变量名。C语言规定,表达式中如果是变量名,则该表达式的值就等于这个变量的值。所以返回的是变量str的值,而变量str的值就等于字符串常量"hello"的地址。而函数结束时,变量str破坏了的,但常数空间中的字符串并不破坏。主程序根据返回的地址就可以找到该字符串。
-------------------------------------------------
#include<iostream>
usingnamespace std;
char* fun(void)
{
char str[]="hello";//先在栈区开辟char类型的6个字节的数组,然后再从常量区将hello拷贝到数组中
return str;//str是栈区中数组的地址,fun调用后,其地址中的数据已经破坏
}
intmain()
{
char *p;
p=fun();
printf("%s\n",p);
getchar();
return 0;
};
//结果:随机值
----
charstr[]="hello"; 是在动态变量区中开辟了可以容纳6个字符的数组,数组名叫str。同时将字符串"hello"(原存放于常数空间)拷贝到这个数组空间中去作为数组的初始化值。
此时若执行returnstr; 其中的str是数组名。C语言规定,表达式中如果是数组名,则该表达式的值就等于这个数组的地址。所以返回的是这个数组的地址,请注意:并不是字符串常量"hello"的地址!而函数结束时,虽然常数空间并不破坏,但这个数组空间是破坏了的,而你返回的是已经破坏了的数组的地址,而却不是常数空间里的地址