C语言中:
1、变量的定义: 对象和变量要区分
变量是一种声明,通过声明,把一个 名字(人为定义) 与 对象对应起来,当我们使用该名字的时候,就表示我们对该对象进行某种操作。
但是并不是每个对象都有名字,也并不意味着有对应的变量。比如临时对象(temporary object)就没有一个名字与之关联(不要误称为临时变量,这是不正确的说法)按照C的定义,左值是一个引用到对象的表达式,通过左值我们可以取出该对象的值。
通过可修改的左值表达式(modifiable lvalue)我们还可以修改该对象的值例如: 对象 = 刘德华;在计算机中进行声明 char andy; 变量 = andy,andy上进行某种操作,即是对刘德华同种操作。
2、& 只能对左值或函数 操作
3、数组 是特殊的指针类型, 数组是常量指针,数组元素是只读的。
声明一个数组包括 :数据类型 数组名[数组长度]
例如 int a[5] = {10,20,30,40,50}.
指针指向一段 5个整型 的 连续内存.
因此 *(a+3) = 40 ,取值符括号里面是地址。而偏移的地址等于 3*int(所占字节)。
回到代码中,只声明了 int类型 的 a[5] 数组,a+3这个变量并没有声明,也没有与之对应的对象,也不就存在。
如果用取地址符去取,根本无法取到对象的地址。肯定是错误的。因为每次重新运行程序,系统又会随机分配空余空间,所以第一张图与二、三
张图地址不一样,但是不影响,这里说明一下。而且细心的人可以发现两个数组地址是连续的。而且先存入内存的反而是低位,后存的反而是高位。由图可知,整形数组a的每个元素之差为4个字节,本机整形占4个字节,字符型占1个字节
内存中划红线的2个16进制数分别 对应 10,20,30,40,50。每个数之间相隔4个字节。
同理可得
分别对应 a b c d ‘\0’
还有就是与数组不同类型的不可以赋值。代码中p类型一样才可以,赋地址成功。