指向数组的指针声明 - 访问问题

时间:2013-10-27 20:55:09

标签: c++ arrays pointers

本网站上最近的一个问题我得到了一些不满足我的答案。

基本上,我有两个相关的问题:

Q值。如果我这样做:

char a[]= "abcde"; //created a string with 'a' as the array name/pointer to access it.

a[0]='z';  //works and changes the first character to z.

但是

char *a="abcde";
a[0]='z'; //run-time error.

有什么区别?没有“const”声明,所以我可以自由更改内容,对吗?

Q值。如果我这样做:

int i[3];
i[0]=10; i[1]=20; i[2]=30;
cout<<*++i;  //'i' is a pointer to i[0], so I'm incrementing it and want to print 20.

这给了我一个编译时错误,我不明白为什么。

另一方面,这有效:

int *i=new int[3];
i[0]=10; i[1]=20; i[2]=30;
cout<<*++i;  //Prints 20.

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

Q

char *a="abcde";
a[0]='z'; //run-time error.

Ans - 这里a指向存储在只读位置的字符串文字。您无法修改字符串文字

Q

int i[3];
i[0]=10; i[1]=20; i[2]=30;
cout<<*++i; 

Ans-数组和指针不是一回事。这里i不是指针。 你需要左值增量操作数

你可以这样做:

int *p = &i[0];
std::cout<<*++p;

在最后一种情况下,operator new返回指向已分配内存空间的指针,因此可能。

答案 1 :(得分:1)

问题1

麻烦的是它仍然是常量。

字符串文字实际上具有char const*类型 但是当他们设计C ++ 03时,他们决定(不幸的是)从char const*char*的转换不是错误。因此代码:

char *a="abcde";

实际编译时没有错误(即使字符串是const)。但是字符串文字仍然是一个const,即使它是通过非const指针指向的。因此非常危险。

好消息是大多数编译器会产生警告:

  

警告:已弃用从字符串常量转换为'char *'

问题2

cout<<*++i;  //'i' is a pointer to i[0], so I'm incrementing it and want to print 20.

此时我不是指针。它的类型仍然是一个数组 增加数组不是一个有效的操作。

你在考虑的事情;是数组在一滴帽子时衰减成指针(就像你将它们传递给函数一样)。不幸的是,这种情况并没有发生,因此你试图增加一个数组(这没有意义)。