|
写程序时无意犯了一个错误,并由这个错误发现了这个问题
自己研究了一下,解释了一下,不确定是否正确,但是说的通
#i nclude <iostream>
using namespace std; int main()
{ char *p=new char[10]="string"; for(;*p!='g';p++) cout<<*p; cout<<endl;
return 0;
} 这段程序定义了一个动态数组并初始化为“string”,然后用这个指向数组的头节点的指针做索引指针进行了遍历,没有出现问题
稍作修改
using namespace std;
int main()
{ char p[10]="string"; //修改:令数组为普通数组,p仍是指向其头节点的指针 for(;*p!='g';p++) cout<<*p; cout<<endl;
return 0;
} 但用这个指针进行遍历,就出现了编译错误:“++ needs l-value” (++操作对象必须是一个左值)
分析一下,p在此应该被编译器解释为一个右值
也即p在此是一个const指针,不可修改其指向
也许,C++规定数组名作为一个const指针,从而防止对其修改
而动态数组的头指针就不是const
但是否真的是如此定义,只是我的猜测,况且为何如此定义也不明白
如此来讲不是有丢失动态数组头指针的危险,以致delete []操作失败的危险么?
有空查一下
PS:第二段程序改一下即可,即将头指针赋予一个专门用于遍历的指针,并用它索引遍历
这种方式对动态数组和普通数组都没有危险,是一种安全且常用的方式
char *index=p;
for(;*index!='g';index++)
cout<<*index;
|
回复Comments
{commenttime}{commentauthor}
{CommentUrl}
{commentcontent}