数组和数组指针在使用上有一些区别,本节使用的vector
数组和pv
指针定义如下:
int vector[5] = {1, 2, 3, 4, 5};
int *pv = vector;
vector[i]
生成的代码和*(vector+i)
生成的不一样,vector[i]
表示法生成的机器码从位置vector
开始,移动i
个位置,取出内容。而*(vector+i)
表示法生成的机器码则是从vector
开始,在地址上增加i
,然后取出这个地址中的内容。尽管结果是一样的,生成的机器码却不一样,对于大部分人来说,这种差别几乎无足轻重。
sizeof
操作符对数组和同一个数组的指针操作也是不同的。对vector
调用sizeof
操作符会返回20,就是这个数组分配的字节数。对pv
调用sizeof
操作符会返回4,就是指针的长度。
pv
是一个左值,左值表示赋值操作符左边的符号。左值必须能修改。像vector
这样的数组名字不是左值,它不能被修改。我们不能改变数组所持有的地址,但可以给指针赋一个新值从而引用不同的内存段。
考虑如下代码:
pv = pv + 1;
vector = vector + 1; // 语法错误
我们无法修改vector
,只能修改它的内容。不过,vector+1
表达式本身没问题,如下所示:
pv = vector + 1;