C语言,在主函数中为什么不能修改函数的返回值???
答案:3 悬赏:70 手机版
解决时间 2021-11-07 16:31
- 提问者网友:你挡着我发光了
- 2021-11-07 10:01
C语言,在主函数中为什么不能修改函数的返回值???
最佳答案
- 五星知识达人网友:慢性怪人
- 2021-11-07 11:18
这个函数返回的是一个地址,不能作为左值
比如你在windows下编程,函数返回值存放在eax寄存器中
那么回到main函数的时候eax里存放的就是whw函数返回的一个地址的值,假设为0xffffffff
想象一下,0xffffffff = 5是几个意思,就类似于表达式15 = 5
退一步讲whw返回的是一个int*类型,怎么能赋个5
就类似
int *p = 5; 也会出错
如果要编译不出错
可以改成这样
int* whw(int* a);
main()
{
int p=12;
*(whw(&p))=5;
printf("*whw(&p)=%d\n",*(whw(&p)));
return 0;
}
int* whw(int* a)
{
return a;
}追问嗯,但是改成如下:
#include
const int* whw(int* a)
{
return a;
}
有一句话*(whw(&p))=5;是不能通过编译的。 函数返回值为const int*是指函数返回值为指针常量,也就是说指针的指向不变。但是指向的内容发是可以变化的啊!!!追答你是什么开发环境,我这边cfree和vc都能通过
~~~~~~~~~~~~~~~~~~~~~~~~~~
你还是没理解我的话
返回值不管它是形容的什么
它本身是一个数值,存放在eax寄存器中,而这个值我们知道是一个地址,这个能明白吧
也就是说如果你不做任何处理他表示的就只是一个地址。而这个地址怎么能作为左值呢?
再举个例子你应该能明白
int func()
{
xxxxxx;
return a;
}
上面的函数最后返回的是一个int类型的数值
那你能够用func() = b吗?当然不能
假如最后a的值为5,那么就变成了5 = b,5能作为左值吗,当然不能,现在明白了吗。
之所以用*,意思是告诉编译器我这个返回值是一个地址,那么加了*号后就可以将等号后面的数值填入这个地址中了。
比如你在windows下编程,函数返回值存放在eax寄存器中
那么回到main函数的时候eax里存放的就是whw函数返回的一个地址的值,假设为0xffffffff
想象一下,0xffffffff = 5是几个意思,就类似于表达式15 = 5
退一步讲whw返回的是一个int*类型,怎么能赋个5
就类似
int *p = 5; 也会出错
如果要编译不出错
可以改成这样
int* whw(int* a);
main()
{
int p=12;
*(whw(&p))=5;
printf("*whw(&p)=%d\n",*(whw(&p)));
return 0;
}
int* whw(int* a)
{
return a;
}追问嗯,但是改成如下:
#include
const int* whw(int* a)
{
return a;
}
有一句话*(whw(&p))=5;是不能通过编译的。 函数返回值为const int*是指函数返回值为指针常量,也就是说指针的指向不变。但是指向的内容发是可以变化的啊!!!追答你是什么开发环境,我这边cfree和vc都能通过
~~~~~~~~~~~~~~~~~~~~~~~~~~
你还是没理解我的话
返回值不管它是形容的什么
它本身是一个数值,存放在eax寄存器中,而这个值我们知道是一个地址,这个能明白吧
也就是说如果你不做任何处理他表示的就只是一个地址。而这个地址怎么能作为左值呢?
再举个例子你应该能明白
int func()
{
xxxxxx;
return a;
}
上面的函数最后返回的是一个int类型的数值
那你能够用func() = b吗?当然不能
假如最后a的值为5,那么就变成了5 = b,5能作为左值吗,当然不能,现在明白了吗。
之所以用*,意思是告诉编译器我这个返回值是一个地址,那么加了*号后就可以将等号后面的数值填入这个地址中了。
全部回答
- 1楼网友:你可爱的野爹
- 2021-11-07 12:30
函数不是变量,怎么能存数呢
- 2楼网友:像个废品
- 2021-11-07 11:57
whw(&p)=5;
没有这种写法的!
没有这种写法的!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯