繁体   English   中英

C语言中变量和数据对象的区别?

[英]Difference between variable and data object in C language?

我正在阅读 C Primer Plus 并遇到以下我无法理解的行-

指针? 他们是什么? 基本上,指针是一个变量(或者,更一般地说,是一个数据对象),其值是一个内存地址。

仅供参考,我之前遇到过这些行-

考虑一个赋值语句。 它的目的是在内存位置存储一个值。 数据对象是可用于保存值的数据存储区域的总称。 C 标准仅使用术语对象来表示此概念。 识别对象的一种方法是使用变量的名称。

我试过谷歌搜索但找不到任何东西。这些基本术语让我感到困惑,所以请帮助我理解这些术语。

数据对象是存储程序使用的信息的内存位置。

变量是程序中用来引用数据对象的名称。

所以如果你写:

int a;

它告诉编译器创建一个可以容纳整数的数据对象,并且在程序中您可以使用名称a来访问该数据对象。

指针是一个数据对象,其值是某个其他数据对象在内存中的位置。 所以如果你这样做:

int *pa = &a;

要创建一个变量pa是指一个数据对象,其内容是数据的地址对象创建作为的结果, a变量声明。

在 C 中,对象是任何占用存储空间的东西。 C 2011在线稿

3. 术语、定义和符号
...
3.15
1 个对象
执行环境中的数据存储区域,其内容可以表示值

左值是一个表达式,它指定一个对象,以便可以读取或修改该对象的内容(基本上,任何可以作为赋值目标的表达式都是左值)。 虽然 C 标准没有定义术语variable ,但您基本上可以将其视为指定对象的任何标识符:

int var;

标识符var指定一个存储整数值的对象; 表达式var是一个左值,因为您可以通过它读取和/或修改对象:

var = 10;
printf( "%d\n", var );

指针是其值是对象位置的任何表达式。 指针变量是存储指针值的对象。

int *p = &var;

标识符p指定一个存储整数对象位置的对象。 表达式&var计算结果为对象var的位置(地址)。 不是左值; 它不能是赋值的目标(你不能更新对象的地址)。 一元&运算符的操作数必须是左值。 表达式p OTOH一个左值,因为您可以为其分配一个新值:

int y = 1;
p = &y;
printf( "%p\n", (void *) p );  // one of the few places in C you need to cast a void pointer

表达式*p指定p指向的对象(在本例中为y )。 它也是一个左值,因为您可以通过它分配给对象:

*p = 5;  // same as y = 5
printf( "%d\n", *p );

所以基本上:

  • varpy是变量(指定对象的标识符)
  • varp*py是左值(可以读取或修改对象的表达式)
  • &var , p , &p &y是指针表达式(值是对象位置的表达式)
  • p是指针变量(存储指针值的对象)

你已经有了答案,但如果你想要:

变量:变量可以被认为是为引用您实际对象的持有者分配的名称,因此当我们说 int x 时,它就像一个不引用任何内容(c 中的垃圾值)的占位符,但是当我们说 int x=10 时; 它用值 10 初始化 x(现在它引用 int 类型的数据对象,在这种情况下,数据对象的名称将由编译器本身维护),我们可以使用名称 x 来访问值 10。

数据对象:正如您所引用的“数据对象是可用于保存值的数据存储区域的通用术语。” 即。 记忆位置

指针:基本上,指针就像存储值的变量,而不是存储实际值(如 int、float、char ..),它们保存存储实际值的内存位置的地址,即对数据对象的引用。

“所以当你说 int x 时,你说声明一个名为 x 的占位符,当你说 int *x 时,你说声明一个名为 x 的占位符,它可以保存对 int 类型的引用。”

数据对象是存储数据的对象,我们计算机中的数据对象是Ram中的寄存器。 每个寄存器都有一个地址位置。 寄存器具有 read_lock 和 write_lock 机制。 在这些寄存器中,您可以存储变量数据和常量数据。 可变数据意味着它可以在整个过程中修改。 意味着,保存变量数据的 Data 对象称为变量。 变量 read_lock 和 write_lock 被禁用。 这就是为什么您可以在整个过程中修改变量(变量数据对象)的原因。 要识别变量数据对象,您需要为其声明一个名称。 例如:int 速度:= 60; 这里的速度是一个变量(变量数据对象),它的大小是 4 个字节。 它只保存整数数据。 变量中的数据在其整个应用过程中是可变的。

在数据对象中,如果您存储常量数据,则这些数据对象称为常量。 对于常量数据对象,rd_lock 被禁用,但 write_lock 被启用。 这就是为什么您可以读取常量但不能为其赋值的原因。 要标识常量,您需要为其声明一个名称。 例如:int const speed = 100; 这里速度是一个常数(常数数据对象)。 速度中的数据在整个应用过程中是不能改变的。这个速度只保存感兴趣类型的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM