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

Declaration of pointer to an array - access issue

本文关键字:访问 问题 指针 数组 声明      更新时间:2023-10-16

这个网站上最接近的问题,我有几个答案不让我满意。

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

问。如果我做这样的事情:

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"声明,所以我应该可以自由更改内容,对吧?

问。如果我做这样的事情:

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.

感谢您的帮助。

Q

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

Ans - 这里a指向存储在只读位置的字符串文字。不能修改字符串文本

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

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

你可以做:

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

在最后一种情况下,运算符 new 返回指向分配的内存空间的指针,因此这是可能的。

问题 1

问题是它仍然是恒定的。

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

char *a="abcde";

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

好消息是,大多数编译器都会生成警告:

警告:已弃用从字符串常量到"char*"的转换

问题2

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

在这一点上,我不是指针。它的类型仍然是一个数组.
递增数组不是有效的操作。

正在考虑的事情是数组在帽子掉落时衰减为指针(就像你将它们传递给函数时一样)。不幸的是,在这种情况下不会发生这种情况,因此您正在尝试增加数组(这没有意义)。