C/C int\[\] vs int\*(指针 vs. 数组表示法)。有什么区别?

新手上路,请多包涵

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

 char c[] = "test";

如果您在函数体中提供此指令,它将在堆栈上分配字符串,而

char* c = "test";

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

您能否在所有使用上下文中列出这两种符号之间的所有差异,以形成清晰的总体视图。

原文由 Alexander Reshytko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 432
2 个回答

根据C99标准:

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

  1. 数组类型的特征在于它们的元素类型和数组中的元素数量。数组类型据说是从其元素类型派生的,如果其元素类型是 T ,则该数组类型有时称为 T 的数组。从元素类型构造数组类型称为 _数组类型派生_。

指针类型可以派生自函数类型、对象类型或不完整类型,称为引用类型。指针类型描述了一个对象,其值提供对被引用类型实体的引用。从引用类型 T 派生的指针类型有时称为 指向 T 的指针。从引用类型构造指针类型称为 _指针类型派生_。

根据标准声明…

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

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

 const char *p = "abc";

…将类型定义为 指向常量 char 的指针的 p 并将其初始化为指向类型为 常量数组 char 的对象( 在 C++ 中),长度为 4,其元素初始化为字符串文字。如果尝试使用 p 修改数组的内容,则行为未定义。

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

下标运算符 [] 的定义是 E1[E2] 等同于 (*((E1)+(E2)))

数组与指针的区别在于:

  • 指针后面没有内存大小的信息(没有可移植的方法来获取它)
  • 无法构造不完整类型的数组
  • 指针类型可以派生自不完整的类型
  • 一个指针可以定义一个递归结构(这个是前两个的结果)

有关该主题的更多有用信息, 请访问 http://www.cplusplus.com/forum/articles/9/

原文由 Sergey K. 发布,翻译遵循 CC BY-SA 4.0 许可协议

char c[] = "test";

这将创建一个包含字符串 test 的数组,以便您可以修改/更改任何字符,例如

c[2] = 'p';

但,

 char * c = "test"

它是一个字符串文字——它是一个 const char。

因此,对这个字符串文字进行任何修改都会给我们带来段错误。所以

c[2] = 'p';

现在是非法的并给我们段错误。

原文由 neel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题