好的,我知道这是无效的
char char_A = 'A';
const char * myPtr = &char_A;
*myPtr = 'J'; // error - can't change value of *myP
[因为我们声明了一个指向常数字符的指针]
为什么这有效?
const char *linuxDistro[6]={ "Debian", "Ubuntu", "OpenSuse", "Fedora", "Linux Mint", "Mandriva"};
for ( int i=0; i < 6; i++)
cout << *(linuxDistro+i)<< endl;
*linuxDistro="WhyCanIchangeThis";// should result in an error but doesnt ?
for ( int i=0; i < 6; i++)
cout << *(linuxDistro+i)<< endl;
感谢您的期待!
答案 0 :(得分:11)
你写
*linuxDistro = "WhyCanIchangeThis";
完全有效,,因为linuxDistro
的声明是
const char *linuxDistro[6];
我。即它是一个由const char
组成的6个指针数组。也就是说,你可以更改指针本身,而不是那些指针指向字符的字符。例如,你无法编译
*linuxDistro[0] = 'B';
获取字符串"Bebian"
,因为字符串包含常量字符...
你可能想要的是一个常量字符常量指针数组:
const char *const linuxDistro[6];
答案 1 :(得分:3)
* linuxDistro仍然是一个指针,它是linuxDistro [0],*linuxDistro="WhyCanIchangeThis"
它只是将指针改为指向一个新地址,而不是修改旧地址中的内容,所以没关系。 / p>
如果你写**linuxDistro='a'
,那就应该出错。
答案 2 :(得分:1)
因为char
不是char[]
,所以当您访问*
char[]
时,您可以访问它的第一个元素(Debian)。
当您移动指针(例如+1)时,您可以访问数组的下一个元素
这是更好理解的好例子
#include <iostream>
using namespace std;
int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
p = &numbers[2]; *p = 30;
p = numbers + 3; *p = 40;
p = numbers; *(p+4) = 50;
for (int n=0; n<5; n++)
cout << numbers[n] << ", ";
return 0;
}
这将输出:
10,20,30,40,50,
答案 3 :(得分:1)
因为指针是一个存储内存地址的变量,如果指针是const
,指针会一直存储相同的内存地址,所以指针本身的值不能改变,但是你什么都不说关于指针指向的值,根据你所拥有的,查找指向的值是一个允许的操作。