C++指针,数组和指针算术

1.首先看一下指针如何进行算术运算:

#include<iostream>
using namespace std;
int main()
{
	double wages[3] = { 10000.0,20000.0,30000.0 };
	short stacks[3] = { 3,2,1 };
	double* pw = wages;
	short* ps = &stacks[0];
	cout << "pw=" << pw << ",*pw=" << *pw << endl;
	pw = pw + 1;
	cout << "add 1 to the pw pointer." << endl;
	cout << "pw=" << pw << ",*pw=" << *pw << endl;
	cout << "ps=" << ps << ",*ps=" << *ps << endl;	
	ps = ps + 1; 
	cout << "add 1 to the ps pointer." << endl;
	cout << "ps=" << ps << ",*ps=" << *ps << endl;
	cout << "stacks[0]=" << stacks[0] << ",stacks[1]=" << stacks[1] << endl;
	cout << "*stacks=" << *stacks << ",*(stacks+1)=" << *(stacks + 1) << endl;
	cout << "sizeof(wages)=" << sizeof(wages) << endl;
	cout << "sizeof(pw)=" << sizeof(pw) << endl;
	return 0;

}

从以上程序可知,*(stacks+1)和stacks[1]是等价的。

数组与指针的区别:

  • 指针的值是可以修改的,而数组名却为常量。
  • sizeof在用于数组名的时候,不会将其解释为地址。

另外,对数组取地址时,数组名也不会被解释为其地址,数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。

short tell[10];//tell an array of 20 bytes
cout<<tell<<endl;//displays &tell[0]
cout<<&tell<<endl;//displays address of whole array

 如下代码显示了数组的地址:

#include<iostream>
using namespace std;
int main()
{
	short tell[10] = { 1,2,3,4,5,6,7,8,9,10 };
	cout << "tell=" << tell << endl;
	cout << "tell+1=" << tell + 1 << endl;
	cout << "&tell+1=" << &tell + 1 << endl; 
	cout << "&tell+2=" << &tell + 2 << endl;
	return 0;
}

    另外,

short *pas[20];//pas为数组,且数组中的每个元素都是short类型的指针。

 short (*pas)[20];//pas为指针,指向一个数组,数组中的每个元素都是short类型。                          2.  给指针赋值。

应将内存地址赋给指针,可以对变量名应用&运算符,来获得被命名的内存地址,new运算符返回未命名的内存地址。

3.对指针解除引用。

对指针解除引用意味着获得指针的值,对指针应用解除引用或间接运算符(*)来解除引用。

cout<<*pn;//print the value of bubble
*pc='S';//place 'S' into the memory location whose address is pc

另一种解除引用的方法是使用数组表示法,例如pn[0]与*pn是一样的,不要对未被初始化为适当地址的指针解除引用。

4.区分指针与指针所指向的值。

如果pt是指向int的指针,则*pt不是指向int的指针,而是完全等同于一个int类型的变量。

5.数组名。

C++在多数情况下可将数组名是为数组的第一个元素的地址。在sizeiof情况下例外。

6.指针算术。

C++允许指针和整数相加,加1的结果等于原来的地址值加上指向的对象占用的总字节数。还可以将一个指针减去另一个指针,获得两个值针的差值。

7.数组的静态联编和动态联编。

使用数组声明来创建数组时,将采用静态联编,即数组的长度在编译阶段设置。

如:int tacos[10];

使用new[]运算符创建数组时,采用动态联编,即在运行时为数组分配内存空间,使用完用delete释放掉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的老年人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值