您的位置:首页 > 其它

数组与指针的区别

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所指向的是一块静态数据区,常量不能改变该部分的值,当试图修改的时候会产生运行是错误,这个错误是不能在编译时期发现的(我们在第二段代码中报的运行时错误正是这个原因)。但是数组中的字符串保存在栈中,是可以改变的(也就是第一段代码可以正常运行的原因)。

第一次写博客,可能会在技术表述上会有错误,欢迎与大家和谐交流,谢谢!
数组与指针的详细区别请读者参见另一篇文章


数组与指针的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: