指针、数组,和指针算术你基本入门了(理解了这些)
2016-01-26 17:15
239 查看
下面给出一段程序源代码:
知识点:
指针和数组基本等价,原因在于指针算术和C++内部处理数组的方式。
将整数变量加1后,其值将加1;但将指针变量加1后,增加的量等于它指向的类型的字节数。
举个例:将指向double的指针加1后,如果你的系统对double使用8个字节存储,则数值将增加8;将指向short的指针加1后,如果你的系统对short使用2个字节存储,则指针将增加2。(上面的程序中已经体会出来了)
3. C++将数组名解释为第一个元素的地址。在使用sizeof运算符时例外,参见第七条。在对数组名取地址时例外,参见第八条。
4. 程序中pw存储的是地址,而*pw存储的是该地址中的值。
5. *(wages + 1 ) 和wages[1]是等价的,这种表达形式可以类推。
6. 数组和指针的区别:可以修改指针的值,而数组名是常量。
7. 数组和指针的区别:对数组应用sizeof 运算符,得到的是数组的长度;而对指针使用sizeof 运算符,得到的是指针的长度,即使指针指向一个数组也是如此。(程序中有体现出来)
8. 对数组去地址时,数组名则不会解释为其地址,而是得到的整个数组的地址。
例如:
short test【10】;
cout<<test<<endl;//显示第一个元素的地址
cout<<&test<<endl;//显示整个数组的地址
解析:从字面上说,这两个地址是等价的。从概念上说&test[0] 即(test)是一个2个字节内存块的地址;而&test是一个20个字节内存块的地址。所以将test+2则是将地址加2,而&test+2则是将地址加20。
换句话说,test是一个short指针(*short),而&test也是一个指针,但是它指向包含了20个元素的short数组(short(*)[20])。这样或许更好理解。
9. 使用new创建数组和使用指针访问不同的元素在程序中是很方便的,只有把指针当作数组名即可,当然了你首先的理解其中的原理,这样的话使用起来便游刃有余了。
// pointer.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { using namespace std; double wages[3] = {3.30,6.60,9.90}; short stacks[3] = { 1, 2, 3 }; double *pw = wages; cout <<"*pw= "<< *pw << endl; //打印指针存放的地址里面的值 cout <<"pw= "<< pw << endl; //打印指针里面存放的地址 cout <<"wages= "<< wages << endl; //打印第一个元素的地址 cout <<"&wages= "<< &wages<< endl; //打印整个数组的地址 cout << endl; cout <<"sizeof wages= "<< sizeof wages << endl; //打印所有数组元素占的地址空间 cout << "sizeof &wages[0]= " << sizeof &wages[0] << endl; // cout << "sizeof &wages= " << sizeof &wages << endl; // cout << "sizeof pw= " << sizeof pw<< endl; // cout << "sizeof *pw= " << sizeof *pw << endl; //打印第一个元素占用的地址空间 cout << "sizeof wages[0]= " << sizeof (wages[0]) << endl; //打印第一个元素占用的地址空间 cout << "sizeof &pw= " << sizeof &pw << endl; //打印指针变量pw本身所占用的地址空间的大小 cout << "sizeof (double)= " << sizeof (double) << endl; //double类型的字节数 cout <<endl << endl; pw = pw + 1; //指针变量加1,相当于加了一个double类型占用的字节数 cout <<"pw = pw + 1= "<<*pw << endl; //此时pw指针指向了数组的第二个元素 *pw = *pw + 1; //指针变量所存放的值加一。 cout <<"*pw = *pw + 1= "<<*pw << endl; //打印指针所指的地址里面存放的值 cout << wages[1] << endl << endl; //通过数组名加下标的形式来访问,验证了指针变量所存放的值加一 pw = pw - 1; //将pw指针从新指向数组的首地址 cout << "pw = pw - 1= " << *pw << endl; cout << wages[0] << endl; //通过数组名加下表的形式访问数组的元素 cout << *(wages + 0) << endl; //通过指针的形式来访问数组元素 cout << wages[1] << endl; cout << *(wages + 1)<<endl; cin.get(); return 0; } </span>程序运行结果:
知识点:
指针和数组基本等价,原因在于指针算术和C++内部处理数组的方式。
将整数变量加1后,其值将加1;但将指针变量加1后,增加的量等于它指向的类型的字节数。
举个例:将指向double的指针加1后,如果你的系统对double使用8个字节存储,则数值将增加8;将指向short的指针加1后,如果你的系统对short使用2个字节存储,则指针将增加2。(上面的程序中已经体会出来了)
3. C++将数组名解释为第一个元素的地址。在使用sizeof运算符时例外,参见第七条。在对数组名取地址时例外,参见第八条。
4. 程序中pw存储的是地址,而*pw存储的是该地址中的值。
5. *(wages + 1 ) 和wages[1]是等价的,这种表达形式可以类推。
6. 数组和指针的区别:可以修改指针的值,而数组名是常量。
7. 数组和指针的区别:对数组应用sizeof 运算符,得到的是数组的长度;而对指针使用sizeof 运算符,得到的是指针的长度,即使指针指向一个数组也是如此。(程序中有体现出来)
8. 对数组去地址时,数组名则不会解释为其地址,而是得到的整个数组的地址。
例如:
short test【10】;
cout<<test<<endl;//显示第一个元素的地址
cout<<&test<<endl;//显示整个数组的地址
解析:从字面上说,这两个地址是等价的。从概念上说&test[0] 即(test)是一个2个字节内存块的地址;而&test是一个20个字节内存块的地址。所以将test+2则是将地址加2,而&test+2则是将地址加20。
换句话说,test是一个short指针(*short),而&test也是一个指针,但是它指向包含了20个元素的short数组(short(*)[20])。这样或许更好理解。
9. 使用new创建数组和使用指针访问不同的元素在程序中是很方便的,只有把指针当作数组名即可,当然了你首先的理解其中的原理,这样的话使用起来便游刃有余了。
相关文章推荐
- 定时任务调度系统设计
- 3. 戏说VHDL之入门游戏一:流水灯
- AC自动机(模板)
- SpringMVC Web配置启动
- 有了Jenkins,为啥还需要一个独立的部署系统?
- Boost 学习之算法篇 is_permutation
- chrome 谷歌浏览器 C:\fakepath\xx解决办法
- iOS---Foundation(NSURLCache.h)简介
- MATLAB Floyd算法求最短路
- web 前端学习
- C#中remoting和webservice的区别
- js编写的简单日历
- SQL SERVER 递归
- 前端笔记七,级联样式单与CSS选择器(二)
- XML——文档类型定义(DTD-Document Type Definition)
- css3学习笔记
- JUnit 4
- 数据库取出的数据含有html标签处理办法
- 欢迎使用CSDN-markdown编辑器
- Hdu 1166 敌兵布阵 -- 线段树