1、C语言引入了"可修改的左值"这个术语。它表示左值允许出现在附值语句的左边。这个术语是为了与数组名区分,数组名也用于确定对象在内存中的位置,也是左值,但它不能作为赋值的对象。因此,数组名是个左值但不是可修改的左值。标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。通俗的说,只能给可以修改的东西赋值!
2、编译器为每个变量分配一个地址(左值)。这个地址在编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知/如果需要用到变量中存储的值,编译器就发出指令从指定地址读如变量值并将它存于寄存器中。
3、 定义数组时,是从编译器符号表中取的数组名的地址然后加上数组下标(偏移量)来进行访问地址中的内容的。
对于指针,编译器首先从符号列表中取的这个指针变量的地址,然后再取得该地址中存储的地址,再通过这个地址进行访问。
>>数组和指针的其他区别:
指针: 保存数据的地址 间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。如果 指针有一个下标[i],就把指针的内容加上i作为地址,从中提出数据。 通常用于动态数据结构 相关的函数为malloc(),free() 通常指向匿名数据
数组: 保存数据 直接访问数据,a[i]只是简单地以a+i为地址取得数据 通常用于存储固定的树木且数据类型相同的元素 隐式分配和删除 自身即为数据名
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋值给指针一个字符串常量进行初始化。(注意只有对字符串常量才是如此。不能指望为浮点数只类的常量分配空间。)如:
float *pip = 3.141; /* 错误!无法通过编译 */
ANSI C中,初始化指针时所创建的字符串常量被定义为只读。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
数组也可以用字符串常量进行初始化:
char a[] = "gooseberry";
与指针相反,由字符串常量初始化的数组是可以修改的。

评论