C 可以使用数组';s的默认指针是否可以更改? #包括 无效变更(int(*arr)[10]){ //操纵 } int main(){ int arrM[10]={1,2,3,4,5,6,7,8,9,0}; 更改(&arrM) }

C 可以使用数组';s的默认指针是否可以更改? #包括 无效变更(int(*arr)[10]){ //操纵 } int main(){ int arrM[10]={1,2,3,4,5,6,7,8,9,0}; 更改(&arrM) },c,arrays,pointers,C,Arrays,Pointers,我知道arrM是一个常量指针,不能更改或分配,也不能像**argv那样作为指向指针的指针传递,因为它降级为数组中的指针,而不是指向指针的指针。但我的问题是“这种设计方式是为了保护数组的初始内存不被覆盖(如果是,是如何实现的?),还是有一种机制可以进入//操纵区域,从而改变常量指针arrM的值?” 我知道arrM是一个常量指针 不,数组不是常量指针。数组是另一种类型。在某些情况下,数组会衰减或隐式转换为指向其第一个元素的指针,例如,当数组传递给函数时,但这并不意味着数组是常量指针 这样的设计是为了

我知道arrM是一个常量指针,不能更改或分配,也不能像**argv那样作为指向指针的指针传递,因为它降级为数组中的指针,而不是指向指针的指针。但我的问题是“这种设计方式是为了保护数组的初始内存不被覆盖(如果是,是如何实现的?),还是有一种机制可以进入//操纵区域,从而改变常量指针arrM的值?”

我知道arrM是一个常量指针

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

这样的设计是为了保护阵列的初始 内存未被覆盖(如果是,如何覆盖?)或是否存在 可以进入可更改区域的机制 常量指针arrM的值

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


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

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

我知道arrM是一个常量指针,不能更改 或指派

数组名(arrM)不应被视为指针,将其视为常量类型太过分了

这基本上回答了你的问题

这样的设计是为了保护阵列的初始 内存未被覆盖(如果是,如何覆盖?)或是否存在 可以进入可更改区域的机制 常量指针arrM的值


阵列的初始内存未受到“保护”。您可以声明一个指针,指向数组的第一个元素,并使用指针算法“覆盖”数组。

您的代码无效。不,不能用C完成。如果您确实想更改
arrM
,则应将
&arrM
传递给
更改()
function.感谢self MadHatter指出这里的错误5表示整数常量?您的意思是我们不能概括适用于一维数组(如int a[10])的内容,其中“a”可以被认为是指向int@muru首先,
a
不是一个常量指针,它是一个数组。其次,变量是内存中的一个位置。该位置有一个名称,即变量名称的标识符。标识符在其整个生命周期中始终引用该位置。不能将其绑定到内存中的其他位置。
#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)
}