如果我增加一个数组变量会怎么样?

我知道如果将指针的地址放在堆上是不安全的,因为以后释放它会导致一些麻烦,但如果在堆栈上声明指针,那么这样做是否安全?

我在谈论这样的事情:

char arr[] = "one two three"; arr++; //or arr--; 

我希望通过引用char数组作为指针来实现这一点。

你不能改变数组的地址。 它会给出编译时错误。 看看: http : //codepad.org/skBHMxU0

编辑:
这些评论让我意识到你的真实意图:类似于:

 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"; char *ptr = arr; // ptr points to the leading 'o' ... ptr++; // ptr now points to 'n' 

就安全性而言,如果增加或减少ptr的结果导致它指向arrays外部的存储器,这可能会或可能不安全地访问或修改,则仍会遇到问题。

它不是指针所在的位置(堆或堆栈),而是指针指向的内存所在的位置。

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

您不能递增数组变量/数组名称,但是您可以使用数组名称/数组变量访问数组的任何元素。 这就是指针进入图片的原因。 数组地址是不可修改的例如,

 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行:我们没有递增数组变量,但是我们使用数组地址获取数组中第一个索引元素的值。