C++ 如果我增加一个数组变量会发生什么?

C++ 如果我增加一个数组变量会发生什么?,c++,c,pointers,stack,heap,C++,C,Pointers,Stack,Heap,我知道,如果指针放在堆上,那么更改它的地址是不安全的,因为以后释放它会引起一些麻烦,但是如果指针在堆栈上声明,那么这样做安全吗 我说的是这样的事情: char arr[] = "one two three"; arr++; //or arr--; char arr[] = "one two three"; char *ptr = arr; // ptr points to the leading 'o' ... ptr++; // ptr now points to 'n' 我希望通过将字

我知道,如果指针放在堆上,那么更改它的地址是不安全的,因为以后释放它会引起一些麻烦,但是如果指针在堆栈上声明,那么这样做安全吗

我说的是这样的事情:

char arr[] = "one two three";
arr++;
//or arr--;
char arr[] = "one two three";
char *ptr = arr;  // ptr points to the leading 'o'
...
ptr++; // ptr now points to 'n'

我希望通过将字符数组作为指针来引用,我做到了这一点。

不能更改数组的地址。它将给出一个编译时错误。看看:

编辑:
这些评论让我意识到了你的真实意图: 比如:

char *ptr = "one two three";
ptr++;
没有问题。字符串“一二三”是一个常量,您可以自由修改
ptr
,但请注意,以后可能会很难再次找到此字符串的开头。。。[但不会发生内存泄漏]


根据经验法则,您负责使用malloc/new专门分配的内存,其余的由编译器负责。

指针所在的内存不是堆或堆栈,而是指针指向的内存所在

堆栈上的内存会自动清理,您必须记住(保留指向)堆上的内存,因为清理它是您的责任。

行:

char arr[] = "one two three";
创建一个数组(这意味着它的位置是固定的),它与指针不同,因为指针位置可以移动。数组默认初始化为“一二三”;您可以将数组的内容更改为日志,因为它的大小不会增加,但不能移动arr

arr++;
因此,这将是一个错误。但是,您可以:

char* ptr = arr;
ptr++;

要获取arr数组的第二个字符。

如所写,您的代码将无法工作,因为
++
的操作数必须是可修改的左值,并且数组表达式不是可修改的左值

您可以这样做:

char arr[] = "one two three";
arr++;
//or arr--;
char arr[] = "one two three";
char *ptr = arr;  // ptr points to the leading 'o'
...
ptr++; // ptr now points to 'n'

就安全性而言,如果递增或递减
ptr
的结果导致它指向阵列外部的内存,则仍然可能会遇到问题,而访问或修改该内存可能安全,也可能不安全

不能增加数组变量/数组名称,但可以使用数组名称/数组变量访问数组的任何元素。这就是指针出现在图片中的原因,。数组地址是不可修改的 比如说,

int k[3]={1,4,3};
printf("%d", *(k+1));  // compiles without any warning o/p is 4
printf("%d", *k++); //Will throw an error, Trying to modify an unmodifiable value

在上面的代码片段中,第2行:我们不是递增数组变量,而是使用数组地址获取数组中第一个索引元素的值

该指针不在堆栈上。将指针更改为动态分配的内存不会有任何固有的错误:
char*p=new char[100]++p
关键是您必须使用原始指针调用
delete
,如
delete p-1这是一个维护噩梦,但并非天生无效。好吧,那么就一个字符*?这解决了代码示例,但没有回答问题。提问者甚至承认代码示例有问题。@Pilpel:我编辑了我的答案,一开始没有正确理解你。@amit但即使我们在做a++时声明char*a=“hai”或char a[]=“hai”;两种情况下我们都会丢失起始地址,对吗?两者有什么不同?