本网站上最近的一个问题我得到了一些不满足我的答案。
基本上,我有两个相关的问题:
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.
感谢您的帮助。
答案 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)
麻烦的是它仍然是常量。
字符串文字实际上具有char const*
类型
但是当他们设计C ++ 03时,他们决定(不幸的是)从char const*
到char*
的转换不是错误。因此代码:
char *a="abcde";
实际编译时没有错误(即使字符串是const)。但是字符串文字仍然是一个const,即使它是通过非const指针指向的。因此非常危险。
好消息是大多数编译器会产生警告:
警告:已弃用从字符串常量转换为'char *'
cout<<*++i; //'i' is a pointer to i[0], so I'm incrementing it and want to print 20.
此时我不是指针。它的类型仍然是一个数组 增加数组不是一个有效的操作。
你在考虑的事情;是数组在一滴帽子时衰减成指针(就像你将它们传递给函数一样)。不幸的是,这种情况并没有发生,因此你试图增加一个数组(这没有意义)。