您的位置:首页 > 其它

二十九、数数组、指针和字符串:指向数组元素的指针和指针数组(左值概念)

2015-04-27 14:19 381 查看
1、指向指针元素的指针
数组在内存中的存储地址是连续的。很明显指针处理这种运算很方便。
如int a[4]={1,2,3,4};
数组名a是一个指针常量(不能改变指向的地址),也就不能进行自增或自减等运算。a和&a[0]是等价的。所以用数组名结合简单的算术运算符就可以访问数组元素。如:
*a; //第一个元素
*(a+1);  //第二个元素,即i+1个元素
*(a++); // '++' needs l-value 错误
//a表示的是一个地址(常量)而非变量,不能做左值,
int* p=a;
*(++p); //正确,p为指针变量,可以做左值
这里又涉及到一个左值概念,详细说明如下。
什么是左值?
C\C+中可以放赋值符号左边的变量,即具有对应的用户可以访问的存储单元,并且可以修改其值的量。左值表示存储在计算机内存中的对象,不是常量或计算结果(这一点需要注意)。
也可以这么理解:左值代表一个内存地址值,通过这个地址可以对内存进行读写操作(主要是写)。这也是为什么左值可以被赋值的原因。

什么是右值?
即放在操作符右边的符号或常量。也是其代表的真实值。简单说就是左值相当于地址值而右值相当于数据值。
我们看以下代码:
int i=0;
int*p=&(i++);  //错误,提示“&”要求左值
int*p=&(++i);  //ok
我们来看下i++,和++i等的函数定义。

//前缀++
int& int::Operator++()
{ //返回引用,即操作自身
*this+=1;
return *this;  //取回值
}

//后缀++
const int int::Operator++(int)  //返回非左型类型,常量int
{//函数带参,说明有另外的空间开辟
intoldValue=*this;
*this+=1;
return oldValue;  //返回被取回值
}


结合左值定义我们很容易理解了。
 
2、指针数组
二维数组在内存中是以行优先的顺序存放的。所以我们可以将二维数组理解为一维指针数组,每个指针元素分别指向二维数组的每一行。
如 int array[2][3]={{1,2,3},{4,5,6}};
相当于一维指针数组,元素为arr[0],arr[1]。分别代表第一行和第二行的首地址。每一行相当于一个有三个元素的一维数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐