无论如何都可以更改数组的默认指针吗?

时间:2014-04-11 05:46:10

标签: c arrays pointers

#include<stdio.h>

void change(int (*arr)[10]){
  // manipulate
}

int main(){
  int arrM[10]={1,2,3,4,5,6,7,8,9,0};
  change(&arrM)
}

我知道arrM是一个常量指针,无法更改或分配,并且它不能作为指向** argv的指针传递,因为它降级为指向数组的指针,而不是指向指针的指针。但我的问题是“这是设计的方式,以保护阵列的初始内存不被覆盖(如果是的话如何?)或是否有一种机制可以进入可以改变常量的//操作区域指针arrM的值“

3 个答案:

答案 0 :(得分:1)

  

我知道arrM是一个常量指针

不,数组不是常量指针。数组是不同的类型。存在数组衰减或隐式转换为指向其第一元素的指针的情况,例如,当一个数组传递给一个函数时,但这并不意味着一个数组是一个常量指针。

  

这是设计的方式,以保护阵列的初始   没有被覆盖的记忆(如果是的话怎么样?)或是否存在   可以进入可以改变的操纵区域的机制   常量指针arrM的值

变量是内存中的一个位置,它可以存储一个值,并由一个标识符引用,该标识符是变量的名称。当定义变量时,为其分配空间(当然,在运行时),并且使标识符引用该位置,即,标识符绑定到该位置。标识符将始终在该生命周期内引用该位置。您无法将标识符重新绑定到其他内存位置。您可以更改变量的值,即存储在变量名称引用的位置中的值,但这是另一回事。任何变量类型都是如此,而不仅仅是数组。

这意味着任何变量都在程序的内存空间的堆栈(自动存储分配)或文本或数据段(静态存储分配)中分配空间。您以后不能将变量绑定到其他地址。

答案 1 :(得分:1)

  

我知道arrM是一个常量指针,无法更改   或指定

数组名称(arrM)不应被视为指针,并将其视为const类型太过分了。

post,几乎可以回答你的问题。

  

这是设计的方式,以保护阵列的初始   没有被覆盖的记忆(如果是的话怎么样?)或是否存在   可以进入可以改变的操纵区域的机制   常量指针arrM的值

数组的初始内存未被&#34;保护&#34;。你可以声明一个指针,指向数组的第一个元素,并使用指针算法来&#34;覆盖&#34;数组。

答案 2 :(得分:0)

不要将arrM视为指针。它有助于将其视为一个类似于常量的整数,其值是编译器分配的数组地址。获取arrM的地址比获取常量5的地址没有意义。同样,更改arrM的值比改变5的值没有意义。