详详解解C语语言言函函数数返返回回值值解解析析
详详解解C语语言言函函数数返返回回值值解解析析
程程序序一一::
int main()
{
int *p;
int i;
int*fun(void);
p=fun();
for(i=0;i<3;i++)
{
printf("%d\n",*p);
p++;
}
return 0;
};
int* fun(void)
{
static int str ]={1,2,3,4,5};
int*q=str;
return q;
}
//不能正确返回
虽然str是在动态变量区,而该动态变量是局部的,函数结束 不保留的。
程程序序二二::
int main()
{
char *p;
char*fun(void);
p=fun();
printf("%s\n",p);
return 0;
};
char * fun(void)
{
char *str="hello";
return str;
}
//可以正确返回
但是,字符串"hello"不是变量,而是一个常量,编译程序在处理这种常量 ,通常把它放在了常量区中。而常量区则是始终存在
的。
后一个例子中函数fun的返回值就是一个指向这种常量区的指针。
函数返回指针,要使主程序可以使用这个指针来访问有意义的数据,关键就是要保证在使用这个指针值的 候,该指针所指向的
地方的数据仍然有意义。
还有,如果指针是指向函数的指针,那么这个指针就是指向程序代码区的。这也是一种应用的情况。
另外,如果明白了它的原理,程序员还可以发明出一些其他灵活的使用方法,当然,那都属于“怪”方法,一般不提倡的。
程程序序三三::
int main()
{
int a,b;
int max;
int fun (int a,int b);
scanf("%d%d",&a,&b);
max=fun (a,b);
printf("\n%d\n",max);
return 0;
};
//
int fun(int a,int b)
{
int max;
if(a>b)
max=a;
else
max=b;
return max;
}
//可以正确返回
程程序序三三::
这个例子中,返回的不是变量max 的地址,返回的是它的值。
return后面的东西,看做一个表达式,返回的是这个表达式的值。
例如,入口如果a是3,b是5,则此 (执行return语句 )max里面存的是5 。而return语句的功能就是把max里面的5取出来,
放到“返回值寄存器”中。
主程序是从“返回值寄存器”得到这个5的 (此 max变量已经不存在了)。
你前面的第二个例子中,同样,指针变量str在函数结束后已经不存在了。但是在return语句中,把指针变量str里面的值 (等于字
符串"hello"存放处的地址)送到“返回值寄存器”中了。
动态变量str不存在了,但常量区中的字符串"hello"还存在。主程序根据返回的地址就可以找到该字符串。