gpt4 book ai didi

c++ - 为什么我可以更改数组

转载 作者:行者123 更新时间:2023-11-30 20:49:42 25 4
gpt4 key购买 nike

我正在准备考试,然后我在网上看到了这个。我的问题是,数组在 c 中基本上不是常量指针(因此出现了错误)?起初我想得到一个关于这个“b+=2”的错误,但没有。

int  func (  int  b[])
{

b +=2;
printf("%d",*b);
}

int main()
{

int arr[]={1,2,3,4};
func(arr);

return 0;
}

(这个程序的输出是 3 btw)

最佳答案

are not the arrays are basically constant pointers in c

不,他们不是。数组是连续的对象序列。指针是通过存储内存地址引用另一个对象的对象。

Why am I able to change the array

b +=2;

b 不是数组。 b 是一个指针。最初,您传递一个指向数组 arr 的第一个元素的指针。向指针添加 1 会将其更改为指向数组的连续元素。添加 2 会将其更改为指向第二个连续元素。从第一个元素开始,第二个连续元素是索引 2 处的元素,在本例中其值为 3。这种指针算术就是指针可用于迭代数组元素的原因。

But it's declared using syntax that's normally associated with arrays

函数参数不能是数组。您可以将参数声明为数组,但该声明被调整为指向数组元素的指针。这两个函数声明在语义上是相同的:

int  func (  int  b[]); // the adjusted type is int*
int func ( int *b );

它们都声明了一个函数,其参数是指向 int 的指针。这种调整并不意味着数组就是指针。这种调整是对数组隐式转换为指向第一个元素的指针的规则的补充 - 这种转换称为衰减。

请注意,参数声明是发生此调整的唯一情况。例如在变量声明中:

int arr[]={1,2,3,4}; // the type is int[4]; not int*
// the length is deduced from the initialiser
int *ptr; // different type

另请注意,调整仅发生在复合类型的“顶层”级别。这些声明是不同的:

int  funcA (  int (*b)[4]); // pointer to array
int funcB ( int **b ); // pointer to pointer
<小时/>

附注您已声明该函数返回 int,但未能提供 return 语句。在 C++ 中这样做会导致程序的未定义行为。

关于c++ - 为什么我可以更改数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59635288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com