C语言中,变量和数据对象有什么区别?

7
我正在阅读《C Primer Plus》时遇到了以下一些内容,我无法理解: “指针?它们是什么?基本上,指针是一个变量(或更一般地说,是一个数据对象),其值是一个内存地址。” 仅供参考,我之前遇到了以下内容- “考虑赋值语句。它的目的是在内存地址中存储一个值。数据对象是一个通用术语,用于表示可以用来保存值的数据存储区域。 C标准只使用术语“对象”来表示此概念。通过使用变量名称来标识对象的一种方法。” 我试图在谷歌搜索但找不到任何东西。这些基本术语让我感到困惑,请帮助我理解这些术语。

1
C语言中的“对象”与C++/OOP中的“对象”不同。请参考http://port70.net/~nsz/c/c11/n1570.html#3.15。 - too honest for this site
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
10

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

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

因此,如果您写入以下内容:

int a;

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

指针是一个数据对象,其值是另一个数据对象在内存中的位置。因此,如果您执行以下操作:

int *pa = &a;

您正在创建一个变量pa,该变量引用的数据对象的内容是作为a变量声明结果创建的数据对象的地址。


那么为什么我们称指针为数据对象而不是变量,尽管它是一个变量? - aj14
2
指针是一个数据对象,其值是另一个数据对象的地址。 - Barmar
1
仅澄清一下:标准中未指定术语“数据”,应避免使用。没有“数据对象”,只有“对象”。与其他编程语言不同,它们包括“函数”,因此可能会在(可执行的,即活动的)代码和(被动的)数据之间进行区分。 - too honest for this site
@Olaf 嗯,我无法弥补他正在阅读的教程使用的糟糕术语,因此我尝试提供一个在那种情况下有意义的答案。 - Barmar
1
@Barmar:我并没有责怪你,只是想把这个作为回答的澄清添加进来。我认为编辑可能不太合适,留下评论是正确的方式。请不要把这理解为批评你的文字! - too honest for this site
显示剩余3条评论

6
在C语言中,对象是指占用存储空间的任何东西。参见C 2011在线草案

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

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

int var;

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

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

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

int *p = &var;
p 标识一个存储整数对象位置的对象。表达式 &var 求值为对象 var 的位置(地址)。它不是一个左值;它不能成为赋值语句的目标(您无法更新对象的地址)。一元运算符 & 的操作数必须是左值。相反,表达式 p 是一个左值,因为您可以将一个新值赋给它。
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)。因为您可以通过它分配给该对象,所以它也是一个lvalue。
*p = 5;  // same as y = 5
printf( "%d\n", *p );

基本上如下:

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

函数也会占用存储空间。但在C语言中,它们明确地不是对象。而且lvalue并不一定是可修改的(考虑const限定的对象)。 - too honest for this site
也许最后一句应该是:p是一个指针变量(指定存储指针值的对象)。如果我错了,请纠正我。 - aj14

-1

你已经有了答案,但如果你还想知道:

变量:变量可以被看作是指向实际对象的名称,因此当我们说int x时,它只是一个指向无意义的占位符(在C中为垃圾值),但当我们说int x = 10时,它将x初始化为值10(现在它引用类型为int的数据对象,而且在这种情况下,数据对象的名称将由编译器自己维护),我们可以使用名称x来访问值10。

数据对象:正如你所引用的“数据对象是一个通用术语,用于表示可用于保存值的数据存储区域。”即内存位置。

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

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


@Olaf 我试图将术语的语言概括为指针的含义...是的,指针是对象。 - RohitS
我并没有概括任何标准...但我仍然尝试用简单的语言回答问题,这可能会让你认为我改变了事物的原始上下文。 - RohitS
@Olaf,你在评论中说的“不一定”,是什么意思?那么你如何定义指针的一般术语呢? - RohitS
指针是对象。我已经给了你足够的信息,只需在标准中查找即可。这是一个法律问题,所以请坚持原则。 - too honest for this site
我仍然不清楚为什么你不考虑我的观点...答案是根据问题给出的,没有任何标准的操纵意图...无论如何,我不能强迫任何人接受我的观点... - RohitS
显示剩余2条评论

-1
数据对象是用于存储数据的对象,在我们计算机中的数据对象是RAM中的寄存器。每个寄存器都有一个地址位置。寄存器有读锁和写锁机制。在这些寄存器中,您可以存储变量数据和常量数据。变量数据意味着它可以在整个过程中进行修改。因此,持有可变数据的数据对象被称为变量。对于变量,读锁和写锁都被禁用。这就是为什么您可以在整个过程中修改变量(可变数据对象)。要识别变量数据对象,您需要为其声明一个名称。 例如: int speed: = 60; 这里的速度是一个变量(可变数据对象),它的大小为4字节。它只保存整数数据。变量中的数据可以在其整个应用程序过程中更改。 在数据对象中,如果您存储常量数据,则这些数据对象被称为常量。对于常量数据对象,rd_lock被禁用,但write_lock被启用。这就是为什么您可以读取常量但不能将值分配给它的原因。 要识别常量,您需要为其声明一个名称。 例如: int const speed = 100; 这里的速度是一个常量(常量数据对象)。其数据在整个应用程序过程中都不可更改,它只保存感兴趣类型的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,