指针、数组、指针算术
2016-05-22 10:25
260 查看
指针是一个变量,存储的是值的地址,而不是值本身。指针的真正用武之地是在运行阶段分配未命名的内存以存储值,在这种情况下,只能通过指针来访问内存。new分配内存,使用delete释放指针指向的内存,但是不会删除指针本身,可以将指针重新指向另一个新分配的内存块。一定要配对使用new和delete。不要使用delete释放同一个内存两次。
使用new来创建动态数组。把指针当数组名就可以访问动态数组元素。指针变量加1后,增加的量等于它指向的类型的字节数。
多数情况下,c++将数组名解释为数组第一个元素的地址。看一数组表达式 stacks[1],c++编译器将该表达式看作是*(stacks+1),这意味着先计算数组第二个元素的地址,然后找到存储在那里的值。*(stacks+1)和stacks[1]是等价的。通常使用数组表示法时,c++都执行下面的转换 arrayname[i] becomes * (arraayname +i),如果使用的是指针,不是数组名,也执行一样的操作,pointername[i] becomes * (pointername
+i),因此在很多情况下,可以相同的方式使用指针名和数组名。可以使用数组方括号表示法,也可以使用解除指针操作符(*),在多数表达式中,它们都是地址,区别在于可以修改指针的值,而数组名是常量;另一个区别是对数组应用sizeof操作符求得是数组的长度,对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。 总之使用new来创建数组以及使用指针访问不同的元素只要把指针当数组名对待即可。例如
#include <iostream>
int main()
{
using namespace std;
int p[10]={1,2,3,4,5,6,7,8,9};
int *q=p; //int*q=&p[0];
cout<<*p<<endl;
cout<<*(p+1)<<endl;
cout<<*(q+2)<<endl;
cout<<*(q+3)<<endl;
cout<<*(p+3)<<endl;
q=q+4; //p=p+4 is invalid
cout<<*q<<endl;
return 0;
}输出是
1 2 3 4 4 5.
使用方括号数组表示法等同于对指针解除引用。
p[0] means *p means *q
p[2] means *(p+2) means *(q+2)
使用new来创建动态数组。把指针当数组名就可以访问动态数组元素。指针变量加1后,增加的量等于它指向的类型的字节数。
多数情况下,c++将数组名解释为数组第一个元素的地址。看一数组表达式 stacks[1],c++编译器将该表达式看作是*(stacks+1),这意味着先计算数组第二个元素的地址,然后找到存储在那里的值。*(stacks+1)和stacks[1]是等价的。通常使用数组表示法时,c++都执行下面的转换 arrayname[i] becomes * (arraayname +i),如果使用的是指针,不是数组名,也执行一样的操作,pointername[i] becomes * (pointername
+i),因此在很多情况下,可以相同的方式使用指针名和数组名。可以使用数组方括号表示法,也可以使用解除指针操作符(*),在多数表达式中,它们都是地址,区别在于可以修改指针的值,而数组名是常量;另一个区别是对数组应用sizeof操作符求得是数组的长度,对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。 总之使用new来创建数组以及使用指针访问不同的元素只要把指针当数组名对待即可。例如
#include <iostream>
int main()
{
using namespace std;
int p[10]={1,2,3,4,5,6,7,8,9};
int *q=p; //int*q=&p[0];
cout<<*p<<endl;
cout<<*(p+1)<<endl;
cout<<*(q+2)<<endl;
cout<<*(q+3)<<endl;
cout<<*(p+3)<<endl;
q=q+4; //p=p+4 is invalid
cout<<*q<<endl;
return 0;
}输出是
1 2 3 4 4 5.
使用方括号数组表示法等同于对指针解除引用。
p[0] means *p means *q
p[2] means *(p+2) means *(q+2)
相关文章推荐
- Json格式与java对象之间的转换
- HTML5 Web SQL 的增删改查操作
- Objective-C ---点语法 (梳理整理)
- 第十二周学习进度
- 动态规划9之1014
- 软考二进宫-这次的软考题有些绕
- Android课程学习:Walker(登录界面)
- OBIEE部署RPD
- L1-015. 跟奥巴马一起画方块(C++)
- bzoj 1005: [HNOI2008]明明的烦恼(组合数学 purfer sequence)
- 推荐系统算法总结
- AppDelegate中几个常用的回调调用时机
- 欧拉 函数
- FileStream类的一些用法
- SublimeText3常用插件及快捷键总结
- 学生管理系统(分层开发)
- 学生管理系统----(分层开发)
- 中缀表达式生成二叉树
- Java compiler level does not match the version of the installed java project facet错误的解决
- Light oj 1249 - Chocolate Thief【水】