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

本文深入探讨了指针与数组的关系,包括指向数组元素的指针如何工作,以及如何使用指针来访问数组中的元素。此外,还介绍了左值与右值的概念,以及二维数组在内存中的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]。分别代表第一行和第二行的首地址。每一行相当于一个有三个元素的一维数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值