C / C ++ INT []对INT *(相对于指针数组符号)。 有什么不同?(C/C++ i

2019-06-17 12:02发布

我知道,在C数组只是指针顺序存储的数据。 但什么差异意味着[]和*在符号的差异。 我所指的是所有可能的使用环境。 例如:

char c[] = "test";

如果你在一个函数体中提供该指令会分配一个栈,而在弦上

char* c = "test";

将指向一个数据(只读)段。

你可以列出所有使用情境这两个符号的所有分歧,从而形成一个清晰的普遍看法。

Answer 1:

根据C99标准:

数组类型描述了具有特定成员对象类型连续地分配非空的一组对象,称为元素类型。

36)数组类型通过它们的元素类型和由阵列中元件的数量来表征。 数组类型被说成是从它的元素类型导出的,并且如果它的元素类型是T ,阵列类型有时也被称为阵列T 。 从元素类型的阵列型的结构被称为阵列型推导

指针类型可以从函数类型,对象类型,或不完整的类型,被称为引用的类型来导出。 指针类型描述一个对象,其值提供给所引用的类型的实体的引用。 从引用的类型派生的指针类型T有时被称为指针T 。 从引用类型指针类型的建筑被称为指针类型推导

根据标准的声明...

char s[] = "abc", t[3] = "abc";
char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };

......是相同的。 的数组的内容是可修改的。 在另一方面,声明...

const char *p = "abc";

...限定P与类型为指针恒定char并对其进行初始化,以指向对象类型恒定阵列char与长度为4,其元素具有字符串文字被初始化( 在C ++中 )。 如果试图使用p修改数组的内容,所述行为是未定义。

根据6.3.2.1 数组下标解引用和数组下标是相同的:

下标操作符的定义[]E1[E2]是相同的(*((E1)+(E2)))

数组与指针的区别是:

  • 指针背后有没有内存大小的信息(没有可移植的方式来得到它)
  • 不完全型的阵列无法构造
  • 指针类型可以由一个不完整的类型来导出
  • 一个指针可以定义一个递归结构(这一个是前两个的结果)

这些链接可能被摄物体有用:

  • http://support.microsoft.com/kb/44463
  • http://www.cplusplus.com/forum/articles/9/


Answer 2:

char c[] = "test";

这将创建一个包含字符串的测试,从而可以修改/更改任何字符数组,说

c[2] = 'p';

但,

char * c = "test"

这是一个字符串字面量 - 这是一个const char。
所以,做任何修改,这个字符串为我们提供了段错误。 所以

c[2] = 'p';

现在是非法的,为我们提供了段错误。



Answer 3:

char []表示类型“的约束炭的未知的数组”,而char *表示类型“字符指针”。 如你观察到的,当型“结合炭的未知的数组”的变量的定义与一个字符串初始化,类型被转换为“炭的阵列[N]”,其中N是适当的大小。 这同样适用于一般的从阵列骨料初始化:

int arr[] = { 0, 1, 2 };

ARR转换为类型“数组为int [3]”。

在用户定义的类型定义( structclassunion ),阵列的未知结合类型禁止在C ++,虽然在C一些版本中他们被允许作为一个结构,在那里他们可以使用的最后一个成员访问分配的内存过去的结构的结尾; 这种用法被称为“柔性阵列”。

递归式施工是另一个差; 可以构建的指针和数组char * (例如char **char (*)[10]但是这是用于未知边界阵列非法; 一个不能写入char []*char [][10]虽然char (*)[]char [10][]是细)。

最后,CV-资格操作方式有所不同; 给定typedef char *ptr_to_chartypedef char array_of_unknown_bound_of_char[] ,CV-qualifiying指针版本预期行为,而CV-出线阵列版本将迁移CV-资格的元素类型:即, const array_of_unknown_bound_of_char相当于const char []和不虚构char (const) [] 这意味着,在一个函数定义,其中的阵列到指针衰变上构建原型之前的参数进行操作,

void foo (int const a[]) {
    a = 0;
}

是合法的; 没有办法使阵列的未知结合参数不可修改的。



Answer 4:

如果你知道, 声明指针变量不创建变量的类型一大堆变得清楚,它指向。 它创建了一个指针变量。

因此,在实践中,如果你需要一个字符串,那么你需要指定字符数组和指针可以在以后使用。



Answer 5:

其实阵列相当于固定指针

此外,炭C []为阵列,其基地址为c本身分配内存。 没有单独的内存分配,用于存储地址。

写的char *下,其基址保存在c字符串分配内存。 此外,单独的存储器位置用于存储℃。



文章来源: C/C++ int[] vs int* (pointers vs. array notation). What is the difference?