数据对象是存储程序所使用的信息的内存位置。
变量是在程序中用来引用数据对象的名称。
因此,如果您写入以下内容:
int a;
它告诉编译器创建一个可以容纳整数的数据对象,并且在程序中,您可以使用名称a
访问该数据对象。
指针是一个数据对象,其值是另一个数据对象在内存中的位置。因此,如果您执行以下操作:
int *pa = &a;
您正在创建一个变量pa
,该变量引用的数据对象的内容是作为a
变量声明结果创建的数据对象的地址。
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 );
基本上如下:
var
、p
和y
是变量(指定对象的标识符)var
、p
、*p
和y
是lvalue(可以读取或修改对象的表达式)&var
、p
、&p
和 &y
是指针表达式(值为对象位置的表达式)p
是指针变量(存储指针值的对象)const
限定的对象)。 - too honest for this site你已经有了答案,但如果你还想知道:
变量:变量可以被看作是指向实际对象的名称,因此当我们说int x时,它只是一个指向无意义的占位符(在C中为垃圾值),但当我们说int x = 10时,它将x初始化为值10(现在它引用类型为int的数据对象,而且在这种情况下,数据对象的名称将由编译器自己维护),我们可以使用名称x来访问值10。
数据对象:正如你所引用的“数据对象是一个通用术语,用于表示可用于保存值的数据存储区域。”即内存位置。
指针:基本上,指针就像存储值的变量,但它们不是存储实际值(如int、float、char等),而是保存实际值存储的内存位置的地址,即对数据对象的引用。
“因此,当你说int x时,你声明了一个名为x的int类型占位符,当你说int *x时,你声明了一个名为x的指针类型占位符,它可以保存对int类型的引用。”