数组与指针的区别
2015-07-13 20:27
295 查看
首先展示两段代码,大家看这两段代码有什么不同:
1.第一段代码:
#include <iostream> #include <string> using namespace std; int main() { char str[]="ab cb efghs";//数组字符串 char *s; char *p; s=strtok_s(str," ",&p); while (s != NULL) { cout<<s<<endl; s = strtok_s(NULL," ",&p); } system("pause"); return 0; }
2.第二段代码:
#include <iostream> #include <string> using namespace std; int main() { char *str="ab cb efghs";//指针指向常量字符串 char *s; char *p; s=strtok_s(str," ",&p); while (s != NULL) { cout<<s<<endl; s = strtok_s(NULL," ",&p); } system("pause"); return 0; }
以上第一段代码中使用了数组保存字符串,第二段代码中使用了指针指向常量字符串的方式,但是第一段代码可以运行出正确的结果 如下图所示。
第二段代码会出现运行时错误,如下图所示。
通过以上例子可以知道,数组和指针不同,但是具体有什么不同我们在运行一段代码,观察数组和指针中的内容保存在什么地方。
<pre class="cpp" name="code">#include <iostream> #include <string> using namespace std; int main() { char str[]="ab cb efghaaa"; char saa[20]="ab cb efgh"; char *pstr="ab cb efghs"; str[0]='x'; pstr[0]='x';//这里会发生运行时错误 system("pause"); return 0; }
通过在VS2010下通过断点调试可以查看对应变量的内存地址,如下图所示,str[]和saa[]中的地址比较相近,而指针pstr的地址与前两个数组的地址相差较远,这是因为数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。但是指针具有变量空间,可以保存地址,也可以随时更改保存的地址,但是在以上代码中pstr所指向的是一块静态数据区,常量不能改变该部分的值,当试图修改的时候会产生运行是错误,这个错误是不能在编译时期发现的(我们在第二段代码中报的运行时错误正是这个原因)。但是数组中的字符串保存在栈中,是可以改变的(也就是第一段代码可以正常运行的原因)。
第一次写博客,可能会在技术表述上会有错误,欢迎与大家和谐交流,谢谢!
数组与指针的详细区别请读者参见另一篇文章
数组与指针的区别
相关文章推荐
- java io流管道流
- hdu 1865 1sting
- String转成字符串数组
- 使用多target来构建大量相似App
- override与重载(overload)的区别
- 深入理解Linux内核-进程
- 游标,又是游标啊,快点让我崩溃到哭了
- awk使用详解
- http://objccn.io/
- 1153_Ray数
- HDU-1076-An Easy Task(Debian下水题测试.....)
- Java集合系列之HashSet源码分析
- (转)【风宇冲】Unity3D教程宝典之Blur
- 约瑟夫问题 链表法
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
- iOS 本地加载js文件
- [LeetCode] Factorial Trailing Zeroes
- Find Minimum in Rotated Sorted Array
- jQuery插件开发之boxScroll与marquee
- Android 开源框架ImageLoader基本介绍及使用