Soh*_*lah 3 c memory addressing
我们在用户输入期间使用&符号(&)运算符。这意味着我们将特定值分配给特定变量的内存地址。但是在赋值期间,我们不需要&符号。在没有任何内存地址规范的情况下如何传递值?下面给出了示例代码。
#include<stdio.h>
int main()
{
int a, b, total;
scanf("%d%d", &a, &b); //& for memory address
total = a+b; //how the value is being tranfarred to total without any memory address?
printf("%d", total);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该scanf函数必须访问正在读取值的对象。所有 C 函数参数都是按值传递的,所以如果你写
int a, b;
scanf("%d%d", a, b); // THIS IS WRONG
Run Code Online (Sandbox Code Playgroud)
该scanf功能只能够看到的价值观a和b,因为他们被称为功能时。那就没办法修改了a。
赋值需要一个左值作为其左操作数。左值(稍微简化)是指定对象的表达式;变量名是最常见的一种左值。由于赋值运算符=内置于语言中,因此它可以具有适用于它的特殊规则。特别是,LHS 上的左值=标识了被分配给的对象;它不会产生该对象的(前一个)值。这就是语言如何定义赋值的。
例如,如果你写:
a = b;
Run Code Online (Sandbox Code Playgroud)
这两个a和b是左值,但他们对待,因为它们的上下文的不同。a指的是名称为 的对象a。b也指一个对象,但在那个上下文中它产生那个对象的当前值。
如果赋值是作为函数调用来实现的,它就必须获取被赋值的对象的地址:
int assign(int *lhs, int rhs);
assign(&a, b);
Run Code Online (Sandbox Code Playgroud)
该语言可能需要一个分配的 LHS 的地址,但只允许目标对象的名称要方便得多。
(为了解释上面的简化,当前标准对lvalue的定义是“一个可能指定一个对象的表达式(具有除 void 以外的对象类型)”。“potentially”这个词的存在是因为,例如,*ptrwhere ptris a pointer 是即使当前值为ptrisNULL的左值。作为左值是一个编译时概念。尝试为其赋值*ptr是合法的,但具有未定义的行为。)