(Q)动态数组和普通数组的数组名指针区别(待定)

      C++ Primer 2006-12-7 20:45

写程序时无意犯了一个错误,并由这个错误发现了这个问题

自己研究了一下,解释了一下,不确定是否正确,但是说的通

#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;

标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}