为什么我不能增加一个数组呢?

时间:2017-03-07 02:19:46

标签: c arrays pointers

MongoError: no SNI name sent, make sure using a MongoDB 3.4+ driver/shell.

我的理解是char a[] = "hello"; 就像一个指向字符串的常量指针。我知道写作a不会起作用,但为什么呢?

5 个答案:

答案 0 :(得分:6)

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

然而,写作

char *p = a;
p++;

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

int a=10;

好吧,我们得到一个存储位置来存储变量a。除此之外,还会在Symbol table中创建一个条目,其中包含变量的地址和存储位置的名称(在这种情况下为a)。 创建条目后,您将永远无法在符号表中进行任何更改,这意味着您无法更新地址。获取变量的地址不是我们的手,这是由我们的计算机系统完成的。 假设我们获得变量400的地址a。 现在计算机已经为变量a分配了一个地址,因此稍后,我们不能要求计算机更改此地址400,因为同样,它不在我们的手中,我们的计算机系统会这样做

现在您对我们声明变量时会发生什么有了一个想法。让我们来问一个问题。

我们声明一个数组。

int arr[10]

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

arr++

当我们增加arr时,我们想增加500,这是不可能的,也不在我们的手中,因为它是由计算机系统决定的,因此我们无法更改它。

我们可以声明一个指针变量

,而不是这样做
int * p= &arr;

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

非常明显的是,如果我们增加a的话,最终我们将丢失数组的地址。如果我们丢失了数组的地址,那么以后如何访问数组?

答案 4 :(得分:0)

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

  

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