繁体   English   中英

为什么我不能增加数组?

[英]Why can't I increment an array?

char a[] = "hello";

我的理解是a就像一个指向字符串的常量指针。 我知道写a++行不通,但为什么呢?

不,增加数组是不行的。 尽管数组可以自由转换为指针,但它们不是指针。 因此,写a++会触发一个错误。

然而,写

char *p = a;
p++;

很好,因为p是一个指针,其值等于a的初始元素的位置。

a++不是良构,因为a衰减为指针,并且衰减的结果不是左值(因此没有状态可以“递增”的持久对象)。

如果要操作指向数组的指针,应首先创建这样一个指针:

char* p = a;   // decayed pointer initializes p

a++;           // OK
++a;           // even OKer

在 C 中分配给数组类型的表达式是不合法的。 增量 ( ++ ) 涉及赋值,因此也不合法。

您在顶部显示的是用于初始化char数组变量的特殊语法。

这实际上是一个很好的问题。 在讨论这个之前,让我们回到基本概念。 当我们声明一个变量时会发生什么?

int a=10;

好吧,我们得到了一个内存位置来存储变量a 除了这个条目被创建成符号表包含变量的地址和存储位置的名称( a在这种情况下)。 一旦条目被创建,你就不能在符号表中改变任何东西,这意味着你不能更新地址。 获取变量的地址不在我们手中,而是由我们的计算机系统完成的。 假设我们得到了变量a地址400 现在计算机已经为变量a分配了一个地址,所以稍后我们不能要求计算机更改这个地址400因为它不在我们手中,我们的计算机系统做到了。

现在你已经知道当我们声明一个变量时会发生什么。让我们来回答我们的问题。

让我们声明一个数组。

int arr[10]

因此,当我们声明这个数组时,我们会在符号表中创建条目,并将数组的地址和名称存储到符号表中。 让我们假设我们得到这个变量的地址500 让我们看看当我们想要做这样的事情时会发生什么:

arr++

当我们增加 arr 时,我们想增加500 ,这是不可能的,也不在我们手中,因为它已经由计算机系统决定了,所以我们不能改变它。

我们可以声明一个指针变量,而不是这样做

int * p= &arr;

在这种情况下会发生什么:再次在符号表中创建一个条目,该条目存储指针变量p的名称和地址。 因此,当我们尝试通过执行p++来增加p ,我们并没有将值更改到符号表中,而是更改了指针变量地址的值,这是我们可以做的,也被允许做的。

同样很明显,如果我们增加a最终我们将丢失数组的地址。 如果我们丢失了数组的地址,那么稍后我们将如何访问该数组?

我认为这里的这个答案解释了“为什么”这不是一个好主意;

这是因为数组在声明的函数中被视为常量指针。 这是有原因的。 数组变量应该指向数组的第一个元素或存储它的连续内存位置块的第一个内存实例。 所以,如果我们可以自由地改变(增加或减少)数组指针,它不会指向块的第一个内存位置。 因此它会失去它的目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM