- 相关推荐
C语言函数返回值解析
用C语言编写不同的函数,函数返回的值是不一样的。下面是小编为大家带来的关于C语言函数返回值解析的知识,欢迎阅读。
程序一:
int main()
{
int *p;
int i;
int*fun(void);
p=fun();
for(i=0;i<3;i++)
{
printf("%d ",*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 ",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(" %d ",max);
return 0;
};
//http://www.bianceng.cn
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"还存在。主程序根据返回的地址就可以找到该字符串。
程序四:
int main()
{
char *p;
char *fun(void);
p=fun();
printf("%x ",p);
printf("%s ",p);
return 0;
}
char* fun(void)
{
// char str[]={'a','b','c','d','e','f','