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

C/C++ int[] vs int* (pointers vs. array notation). What is the difference?

本文关键字:int 表示 数组 区别 什么 C++ vs 指针      更新时间:2023-10-16

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

char c[] = "test";

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

char* c = "test";

将指向数据(只读(段。

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

根据 C99 标准:

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

  1. 数组类型的特点是其元素类型和数组中元素的数量。数组类型称为派生自其元素类型,如果其元素类型为 T ,则数组类型有时称为T数组。数组的构造元素类型的类型称为数组类型派生

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

根据标准声明

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

是相同的。数组的内容是可修改的。另一方面,宣言

const char *p = "abc";

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

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

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

数组和指针的区别是:

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

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

char c[] = "test";

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

c[2] = 'p';

char * c = "test"

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

c[2] = 'p';

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

char []表示

类型"未知字符边界数组",而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-qualififing的操作方式不同;给定typedef char *ptr_to_chartypedef char array_of_unknown_bound_of_char[],cv限定指针版本的行为将按预期,而cv限定数组版本会将cv限定迁移到元素类型:也就是说,const array_of_unknown_bound_of_char等同于const char []而不是虚构的char (const) []。 这意味着在函数定义中,数组到指针衰减在构造原型之前对参数进行操作,

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

是合法的;没有办法使未知绑定参数数组不可修改。

如果您知道声明指针变量不会创建它指向的变量类型,那么整个事情就会变得清晰起来。它创建一个指针变量。

因此,在实践中,如果您需要一个字符串,则需要指定一个字符数组,并且稍后可以使用指针。

实际上数组等效于常量指针

此外,char c[] 为数组分配内存,其基址为 c 本身。没有为存储该地址分配单独的内存。

写入 char *c 为基址存储在 c 中的字符串分配内存。此外,使用单独的内存位置来存储 c。