2023-06-26 19:18:56 | 我爱编程网
在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!,今天我们将为大家详细解释这两个词,以及两者的区别!
简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。但更多时候,我们是为了学习和理解不同情况下左值和右值的区别,下面来举例依次说明,着层深入,来让大家解渴!
如 x = 2;
这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。
再如x = y;
现在看变量做右值情况,y做右值,这里呢就不在表示地址,而是代表该内存单元上的值!然后赋给x。
继续 x = 2;我爱编程网
这里2做右值, 2是一个常量,没有任何疑问。
而如果 1 = 2;
这里我们看左值,是1是常量,这里就会有问题了,编译会报错!因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。
例如有字符数组char a[100];
当a做右值时候,我们可以把它赋给char *类型的指针,用来指向这个数组,这种情况下数组名做右值代表该数组首元素的首地址,是常量,是完全可以的。
而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的!
字符串常量想必大家都很清楚,是用双引号括起来的字符串,既然也是常量,也理所当然不可以做左值,但做右值呢?
答案是,会表示该字符串在内存中存储位置的首地址。就就是char * p = “dotcpp.com”;用法的原因。
以上四种,希望对大家深入理解左值和右值有帮助!大家有任何问题,请随时留言讨论!
最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下:
直接返回str数组名(注意不需要加&,还有好多同学犯这个错)但事实上,运行结果并非正常,我们尝试在调用函数中输出,可以看到结果并非是原来内容(当然你的电脑输出可能还不是这个样子)
如下:
原因大家可以从str的属性入手,str本身是一个自定义函数中的局部变量,是一个数组有一百个字节,它的生命周期当然也随着它所在的函数一起,正所谓“一招天子一朝臣”,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,理所当然的str数组这一百个字节也将被收回,所以”Hello www.dotcpp.com”这串字符串也就灰飞烟灭了!自然你在main函数里再输出肯定已经不是原来的内容了!
怎么样,可以理解吧!不过,还没有结束,依然有同学继续问,可为什么我换成下面这种写法就可以了呢?
如下图:
答曰:这种写法情况下,str虽也属于是局部变量,但不是一个数组,而是一个指针,只有四个字节,存的是在常量区的字符串” Hello www.dotcpp.com”,但请注意,这个字符串在常量区,而不属于fun函数里的部分,全程序都可读,所以return之后依旧存在,返回的是str里的值,也就是字符串“Hello www.dotcpp.com”的首地址,是一个数,其实相当于把这个字符串的地址在str手里通过返回值转交到p里。
也可以打个比方:之前只有fun函数知道这个字符串,但现在已经马上不行了,临终前,交代:“我快不行了,赶紧把‘Hello www.dotcpp.com’的藏宝地址(字符串首地址)转交到main函数里!”
然后就return 快马加鞭的返回到main函数手里了!随后消失…
而后,main函数获得之后,你们也就知道了…
这样讲,大家能理解吗?
后期C语言逆向分析部分,也会有涉及到此处的原理,大家可以再深入学习理解。
同时,下篇我们将为大家讲解如何实现自定义函数的数组传递问题!
更多相关文章关注我爱编程网:www.52biancheng.com
C语言timer函数和time函数Timer()函数语法:Timer(interval{,windowname})参数:指定两次触发Timer事件之间的时间间隔,有效值在0到65之间。如果该参数的值指定为0,那么关闭定时器,不再触发指定窗口的Timer事件。windowname:窗口名,指定时间间隔到时要触发哪个窗口的Timer事件。省略该参数时,触发当前窗口的Timer事件返回值
如何用c语言在windows平台上开发phpextension何使用C语言发PHP扩展函数功能:php面整数符号数其内部实现其实longunsignedlong于32位机器说php能表示整数2^31-1般应用碰于2^31-1于2^32数能用字符串表示于mixedint_ext(stringin)说字符串in表示整数于2^31-1返整数于返字符串发扩展步骤:(首先需要载php源码载
c语言可以写java吗c语言学完可以转java吗?当然可以转,但如果说你学C语言的目标是为了初步掌握编程基础,并打算学习更高级语言做web开发,那可以考虑直接去学java。C语言是高级语言的基础,也是高级语言入门的最佳选择之一,C语言面向过程写程序按部就班自由性比较大,java基础比较简单,没有语言基础的照样能学会。在你学了C语言之后,顶多了解了C语言的思想以及某些语法。但是在java
PHP与C语言的语法有什么不同PHP与C语言的语法有什么不同?PHP的基本语法和C是很相似的,可以说大部分编程语言的基本语法都是如出一辙的:顺序、选择(if)、循环(while)。不同之处有变量定义,还有实现的具体细节。但是,php主要是部署网站用的,所以大部分时候是要嵌在HTML语言里面的,并且与JS混合在一起,所以表面看上去很乱,远远没有C语言的单纯。以上是对格式方面的理
php中的几个输出函数1echo();2print();3die();4printf();5sprintf();6print_r();7var_dump();1echo()可以同时输出多个字符串,可以多个参数,并不需要圆括号,无返回值。2print()只可以同时输出一个字符串,一个参数,需要圆括号,有返回值,当其执行失败时返flase.print的用法和C语言很像,所以会对输
PHP用到的C语言中的“指针”多吗?php没有指针的概念.=============如果学习PHP的话还有没有必要学习“指针”“结构体共同体”“编译预处理”等知识点?================单从php来说,的确是用不上.但是既然都学习了前面几章,何不顺带看一下呢.即使PHP中没有指针概念,但你要理解了指针概念,对PHP的引用概念搏侍就很容易理解了.编译预算处理
java如何调用c语言源文件并进行执行?要在java中调用c语言的库,需要使用Java提供了JNI。\x0d\x0a举例说明\x0d\x0a在c语言中定义一个voidsayHello()函数(打印HelloWorld);然后在Java中调用这个函数显示HelloWord.\x0d\x0a现在分别从Java和C语言两部分说明:\x0d\x0a1.Java部分\x0d\x0a首先定义一个Hell
PHP和HTML语言有什么区别简单的说,HTML是典型的静态网络编程用语,而PHP则是一种可实现动态的编程语言。简单举例:<?phpecho"<p>Orderprocessedat".date('H:i,jsFY')."</p>";?>在这段代码中,我们使用PHP语言中内置的函数date()来告诉客户其订单被处理的日期和时间。
2025-02-01 20:24:39
2025-02-12 03:21:37
2025-02-10 15:19:48
2025-01-28 17:58:32
2024-11-22 05:08:01
2024-01-05 14:11:24